c++ 執行緒函式傳遞資料 namespace

MKT-porter發表於2024-08-13

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

# Set the project name
project(GlobalMatrixExample)

# Find Eigen package
find_package(Eigen3 3.3 REQUIRED)

# Find pthread package
find_package(Threads REQUIRED)

# Add executable
add_executable(global_matrix_example main.cpp)

# Link Eigen3 and pthreads to the target
target_link_libraries(global_matrix_example Eigen3::Eigen Threads::Threads)

  main.cpp

#include <iostream>
#include <Eigen/Dense>
#include <thread>
#include <mutex>

/*
namespace 用於組織和管理程式碼的作用域,使得不同部分的程式碼能夠清晰地分隔和訪問共享的資料或功能。
指標用於直接操作和訪問記憶體中的資料,允許動態記憶體分配和傳遞資料的引用。

namespace 透過定義全域性變數來實現資料共享,這些變數可以在整個程式中訪問,但它們的訪問和修改需要保證執行緒安全。
指標透過傳遞記憶體地址來實現資料共享,可以在多個執行緒或函式之間共享和修改資料,指標操作本身並不保證執行緒安全,必須透過額外的機制(如互斥量)來保護資料的訪問。
*/
namespace MyNamespace {
    // 全域性變數
    Eigen::Matrix4d globalMatrix;
    double globalValue = 0.0;
    std::mutex matrixMutex; // 用於保護 globalMatrix 的互斥鎖

}

// 修改矩陣的執行緒函式
void modifyMatrix(int threadId) {
    std::lock_guard<std::mutex> lock(MyNamespace::matrixMutex); // 鎖定互斥鎖
    MyNamespace::globalMatrix(0, threadId) = threadId; // 修改矩陣中的一個元素

    MyNamespace::globalValue += threadId * 1.0;
    std::cout << "Thread " << threadId 
    << " modified matrix:\n" << MyNamespace::globalMatrix 
    << " \n updated globalValue to " << MyNamespace::globalValue 
    << std::endl;
}

int main() {
    // 初始化矩陣
    MyNamespace::globalMatrix.setZero();

    // 建立多個執行緒
    std::thread t1(modifyMatrix, 1);
    std::thread t2(modifyMatrix, 2);
    std::thread t3(modifyMatrix, 3);

    // 等待所有執行緒完成
    t1.join();
    t2.join();
    t3.join();

    // 輸出最終矩陣
    std::cout << "Final matrix:\n" << MyNamespace::globalMatrix 
    << " \n Main thread final globalValue: " << MyNamespace::globalValue 
    << std::endl;

    return 0;
}

  

相關文章