c++ 執行緒函式傳遞資料 物件和變數

MKT-porter發表於2024-07-26

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

  

相關文章