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; }
标签:MyNamespace,package,namespace,线程,threadId,传递数据,include From: https://www.cnblogs.com/gooutlook/p/18357945