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