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