首页 > 编程语言 >c++ 线程函数传递数据 namespace

c++ 线程函数传递数据 namespace

时间:2024-08-13 23:26:58浏览次数:5  
标签:MyNamespace package namespace 线程 threadId 传递数据 include

 

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

相关文章

  • c# 多线程环境下对共享资源访问的办法
    Monitor:定义:Monitor 是C#中最基本的同步机制,通过 Enter 和 Exit 方法来控制对共享资源的访问。它提供了排他锁的功能,确保在任何时刻只有一个线程可以访问共享资源。优点:简单易用,适合对临界区进行粗粒度的同步控制。缺点:只能实现排它锁,不能实现读写锁,性能相对较低。......
  • 主线程等待所有其他线程执行完毕,然后再继续执行主线程的逻辑,有以下几种方法可以实现:
    ##1.使用`Thread.join()``Thread.join()`方法会让主线程等待被调用线程执行完毕之后再继续执行。####示例代码:```javapublicclassMain{publicstaticvoidmain(String[]args){//创建3个线程Threadthread1=newThread(()->{Syste......
  • 进程线程(2)
    父子进程的关系子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。        在fork之后,一般情况哪个会先运行,是不确定的。如果非要确定那个要先运行,需要IPC机制。     区别:fork的返回值pid不同进程的创建创建之后,父子进程各自拥有4g独立的内存......
  • 【JVM】jvm 线程栈的一些设置 Thread Size
    1.概述下面是jvm线程栈的一些设置,简单的了解一下。2.XssXss和ThreadStackSize是等价的参数,用于设置Java线程栈的大小,单位为Kb。在命令行中,-Xss100K和-XX:ThreadStackSize=100是表示相同意义的参数。Xss参数的实现:Xss参数是通过设置ThreadStackSize数据......
  • Java线程池学习
    Java线程池学习一、线程池基础1定义2优点3基本组件二、Java线程池实现1Executor接口2ExecutorService接口3ThreadPoolExecutor类3.1创建线程池实例三、执行策略1直接提交策略(DirectSubmissionExecutor)2固定线程数策略(FixedThreadPool)3缓存线程池策略......
  • C 多线程
    C多线程C程序中经常同时执行多项任务。例如,一个程序可能:(1)在执行程序过程中通过完成并行任务来提高性能。(2)在处理用户输入的同时,在后台进行耗时的数据通信和实时操作。通过并行执行(concurrentexecution)程序中的部分代码,可以实现不同任务同时进行。特别是在多处理器系......
  • 游戏安全入门-扫雷分析&远程线程注入
    前言无论学习什么,首先,我们应该有个目标,那么入门windows游戏安全,脑海中浮现出来的一个游戏--扫雷,一款家喻户晓的游戏,虽然已经被大家分析的不能再透了,但是我觉得自己去分析一下还是极好的,把它作为一个小目标再好不过了。我们编写一个妙妙小工具,工具要求实现以下功能:时间暂停、修......
  • 千万别从系统中创建线程, 看看从线程池中调用的线程的效率(实践篇)
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • 多线程
    多线程1.进程与线程1.1.什么是进程进程就是正在运行的程序,它是系统进行资源分配和调度的基本单位,各个进程之间相互独立,系统给每个进程分配不同的地址空间和资源Win操作系统任务管理器查看应用程序运行的进程1.2.什么是线程线程就是程序(进程)执行的任务(分为单线程和多线程......
  • VS2022+QT6.7.2 子线程与主线程通信(详细)(注释)
    需求:主线程将需要计算的数据发送给子线程,子线程将计算后的结果返回给主线程。实现逻辑:(前提:子线程类已创建好,并使用start方法启动子线程)1、主线程的mysignal1信号触发子线程的myslot2槽函数方法:connect(this,&QtWidgetsApplication13::mysignal1,st,&mythread::myslot2);......