首页 > 编程语言 >c++ 线程函数传递数据 对象和变量

c++ 线程函数传递数据 对象和变量

时间:2024-07-26 23:52:10浏览次数:15  
标签:std obj lock c++ vector bool 传递数据 线程

 

 

 

 

 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MyProject)


# 查找并添加线程库
find_package(Threads REQUIRED)

# 添加可执行文件
add_executable(my_program main.cpp)

# 添加线程库链接
target_link_libraries(my_program Threads::Threads)

  main.cpp

 

#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
//#include <chrono>

#include <unistd.h> // For sleep()

using namespace std;


 std::mutex mtx2;

class MyObject {
private:
    std::vector<int> data;  // vector 数据成员
    bool flag;              // bool 数据成员
    std::mutex mtx;         // 互斥锁,保护对象数据的访问

public:
    MyObject(const std::vector<int>& d, bool f) : data(d), flag(f) {}

    void modifyVector() {
        //std::lock_guard<std::mutex> lock(mtx); // 上锁作用于结束自动关锁
        mtx.lock(); // 上锁
        for (int i = 0; i < data.size(); ++i) {
            data[i] *= 2; // 修改 vector 中的每个元素
        }
         mtx.unlock(); // 解锁
    }

    void modifyBool(bool newFlag) {
        std::lock_guard<std::mutex> lock(mtx); // 上锁
        flag = newFlag; // 修改 bool 变量
    }

    const std::vector<int>& getVector() const {
        return data;
    }

    bool getBool() const {
        return flag;
    }
};

// 第一个线程函数
void threadFunction1(MyObject& obj,bool &new_gnss) {

    while (1)
    {
        sleep(5); 
        obj.modifyVector();
        obj.modifyBool(true);
        std::lock_guard<std::mutex> lock(mtx2); // 自动上锁关锁
        new_gnss=1;
        std::cout << "Thread 1 发送数据  " <<  obj.getBool()<< "  "<< new_gnss <<std::endl;
    }
    

}

// 第二个线程函数
void threadFunction2(MyObject& obj,bool &new_gnss) {

    while (1)
    {   
        sleep(1); 
        obj.modifyVector();
        obj.modifyBool(false);
        
        std::lock_guard<std::mutex> lock(mtx2); // 自动上锁关锁
        if(new_gnss){ 
            std::cout << "线程2 新数据到达" <<endl; 
            new_gnss=0; 
        }
        else{
             std::cout << "线程2 没有新数据到达" <<endl; 
            
            }
       
        //std::cout << "Thread 2 modified data  " <<  obj.getBool() << "  "<< new_gnss <<std::endl;

    }
}

int main() {
    std::vector<int> initData = {1, 2, 3, 4, 5};
    MyObject obj(initData, false);
    bool new_gnss=0;

    // 创建两个线程并开始执行,传递对象引用
    std::thread t1(threadFunction1, std::ref(obj),std::ref(new_gnss));
    std::thread t2(threadFunction2, std::ref(obj),std::ref(new_gnss));

    // 等待两个线程执行完毕
    t1.join();
    t2.join();

    // 输出最终的对象数据
    const std::vector<int>& finalVector = obj.getVector();
    std::cout << "Final contents of vector:";
    for (auto num : finalVector) {
        std::cout << " " << num;
    }
    std::cout << std::endl;

    bool finalBool = obj.getBool();
    std::cout << "Final value of bool: " << std::boolalpha << finalBool << std::endl;

    return 0;
}

  

标签:std,obj,lock,c++,vector,bool,传递数据,线程
From: https://www.cnblogs.com/gooutlook/p/18326470

相关文章

  • 线程隔离的艺术:Perl中的线程局部存储解析
    线程隔离的艺术:Perl中的线程局部存储解析在多线程编程中,线程局部存储(Thread-LocalStorage,TLS)是一种关键技术,它允许每个线程拥有自己的变量副本,从而避免线程间的资源冲突。Perl作为一种支持多线程的编程语言,提供了丰富的机制来实现线程局部存储。本文将深入探讨Perl中的线......
  • [C++]广度优先遍历
       代码与图见上图思路定义一个一维数组(char)和一个二维数组(int),一个bool类型数组来判断该节点是否被访问过。函数中定义队列,对各个结点进行入队出队,并标记为已访问。当该邻结点未被标记且与该节点连接,进行上述操作。注意:for循环的i变量初始赋值随二维数组而变化。如:......
  • C++文件系统操作6 - 跨平台实现文件和文件夹的拷贝
    1.关键词2.fileutil.h3.fileutil.cpp4.filesystem_win.h5.filesystem_win.cpp6.filesystem_unix.cpp7.源码地址1.关键词C++文件系统操作拷贝文件拷贝文件夹跨平台2.fileutil.h#pragmaonce#include<string>#include<cstdio>#include<cstdint>#i......
  • 【C++/STL】map和set介绍
    ......
  • C++11 emplace系列函数:性能提升的秘密武器
    C++11引入的emplace系列函数(如emplace_back、emplace、emplace_hint等)为STL容器提供了一种更高效的元素插入方式。这些函数不仅可以提高代码的性能,还能让我们的代码更加简洁优雅。今天,我们将深入探讨emplace函数的优势,并通过实例来展示它们的强大之处。emplace函数的主要优势......
  • C++初学者指南-6.函数对象--lambdas(基础)
    C++初学者指南-6.函数对象–lambdas(基础)文章目录C++初学者指南-6.函数对象--lambdas(基础)提醒:函数类和对象Lambdas变量捕获保存闭包通用Lambdas(C++14)广义捕获(C++14)相关内容幻灯片提醒:函数类和对象类至少提供一个operator()(…){…}函数能像一个......
  • Visual C++ 官方版下载与安装教程(微软常用运行库合集|DLL报错必装)
    前言MicrosoftVisualC++Redistributable(简称MSVC,VB/VC,系统运行库)是Windows操作系统应用程序的基础类型库组件。此版VisualC++运行库组件合集(微软常用运行库合集)由国内封装爱好者@Dreamcast打包而成,整合VisualC++组件安装包运行库所有版本,提供图形安装界面,可自选更新V......
  • C++中的内存管理
    目录一.C/C++的内存分布二.C++内存管理方式 1.new/delete操作内置类型2.new/delete操作自定义类型 三.operatornew与operatordelete函数 四.new和delete的实现原理1.实现内置类型 2.实现自定义类型五.定位new表达式(placement-new)六.malloc/free......
  • java多线程把数据迁移到不同数据库中
    publicvoidsync_table_test_thread()throwsSQLException,InterruptedException{    longstart=System.currentTimeMillis();    SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");    //获取要迁移oracle表数据库......
  • 讨论异步与多线程的关系及区别
    在面试中讨论异步与多线程的关系及区别时,可以从以下几个方面来阐述:关系:并行性:多线程和异步编程都是为了提高程序的并发能力。在某些情况下,异步操作可以通过多线程的方式来实现。应用场景:当需要处理耗时的操作(如I/O操作、网络请求等)时,可以使用异步编程来避免阻塞主......