如何跨线程同步变量? C ++

时间:2012-07-29 07:06:21

标签: c++ multithreading

让我说我有A)全局变量B)局部变量,但另一个线程有一个ptr

让我说我有这个代码

thread2(&localVar);//now thread2 can modify it
localVar=0;
globalVar=0;
while(1){
    mutex.lock();
    cout << (globalVar && localVar ? "Both true" : "fail");
    mutex.unlock();
    Sleep(1000)
}

这是正确和安全的吗?我不记得了。如果是我的问题是C ++如何知道localVar和globalVar可能已被修改?如果你说因为互斥锁定/解锁那么我的问题是为什么?当调用任何函数时,C ++是否认为变量可能已被修改并需要重新加载到寄存器中?

如果这不安全那么是什么让它不安全? (我怀疑如果不是那么只有localVar是不安全的),我该怎么纠正呢?

3 个答案:

答案 0 :(得分:2)

你做的事情要复杂得多。您的责任是确保不会发生对变量的冲突访问

定义:对给定内存位置的两次访问冲突 iff 它们可以同时发生,至少一次是写访问

所以:

  • 两次写入同一内​​存位置=坏
  • 读取和写入相同的内存位置=坏

要确保永远不会发生这种情况,您可以使用mutex,或者设计程序,以便只读取线程之间共享的变量。还有许多其他可能的策略。

如果我正确理解了您的不完整代码:localVar在两个线程中同时修改。 未定义行为。任何事情都可能发生。

答案 1 :(得分:0)

  

这是正确和安全的吗?

没有

修复:在创建第二个线程之前初始化localVar和globalVar。

你已经将localVar(在本地堆栈上?local var在堆栈中建议)暴露给另一个线程很麻烦。如果这个localVar在堆栈上,那么请确保你不要让它超出范围。

您是否在另一个线程上使用相同的互斥锁,以保护读/写访问权限?如果是,那么这将走向安全。

这不是“C ++知道localVar和globalVar可能已被修改过吗?”的问题:C ++不知道。对于这种情况,如上所述,所有关于使用互斥锁来正确保护对所有共享值的所有访问都是如此。如果两个线程都使用互斥锁,则一次只允许一个线程通过受保护的代码。试图锁定互斥锁的任何其他线程将“停止并等待”,直到锁定被释放。

因此,通过使用互斥锁读取这对值,您就处于正确的轨道上。

  

当调用任何函数时,C ++是否认为变量可能已被修改并需要重新加载到寄存器中?

作为一般规则,是的。

答案 2 :(得分:0)

我认为第一次获取本地变量的地址时,它变得易变,并且所有读写都在内存中执行。