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; }