很烫的凉水 2023-02-22 19:38 采纳率: 85.7%
浏览 18
已结题

c++多线程函数不准引用变量

如题,怎么解决

#include<iostream>
#include<thread>//join detach
#include<windows.h>
using namespace std;
const int N=0;
void add(int *n,int f){
    n+=f;
}
int main(){
    int n=0;
    thread s1(add,n,3);
    thread s2(add,n,4);
    s1.detach();
    s2.detach();
    Sleep(100);
    cout<<n;
    return 0;
}


  • 写回答

3条回答 默认 最新

  • GPT_Pro 2023-02-22 19:46
    关注

    该回答内容部分引用GPT,GPT_Pro更好的解决问题
    在C++中,多线程函数不准引用变量,是因为多线程函数在执行过程中可能会修改变量的值,而由于多个线程可能会同时访问该变量,因此当一个线程正在修改该变量时,其他线程也可能访问该变量,这样就可能导致数据不一致的问题,从而影响程序的正常执行。

    要想解决这个问题,首先要明确一点,就是多线程函数中不应该直接引用变量。如果需要使用该变量,则需要将变量的值拷贝到一个新的局部变量中,然后在函数中使用这个局部变量。这样就可以避免由于多个线程同时访问而导致的数据不一致问题。

    此外,为了保证在多线程函数中的数据安全性,还需要使用互斥量来对多线程函数中的代码进行同步,以保证在多个线程同时访问共享数据时不会发生冲突。

    例如:

    #include<iostream>
    #include<thread>
    #include<mutex>
    using namespace std;
    const int Ne = 10; // 共享变量 
    int n = Ne; // 共享变量 
    // 互斥量 
    mutex mu; 
    void add(int *n,int f){ 
        mu.lock(); // 加锁 
        (*n) += f; 
        cout << "add:" << *n << endl; 
        mu.unlock(); // 解锁 
    } 
    int main(){ 
        thread t1(add,&n,3); // 创建新线程,并传入参数 
        thread t2(add,&n,4); // 创建新线程,并传入参数 
        t1.detach(); // 线程分离 
        t2.detach(); // 线程分离 
        Sleep(100); // 等待100ms 
        cout << "final:" << n << endl; // 输出最后的值 
        return 0; 
    } 
    

    如果回答有帮助,望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月22日
  • 创建了问题 2月22日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。