0

假设我有 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 是不安全的),我该如何纠正它?

4

3 回答 3

2

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

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

所以:

  • 两次写入同一内​​存位置 = 错误
  • 对同一内存位置的读取和写入 = 错误

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

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

于 2012-07-29T07:14:38.050 回答
0

这是正确和安全的吗?

不。

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

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

您是否在另一个线程上使用相同的互斥锁来保护读/写访问?如果是,那么这是朝着安全的方向发展。

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

因此,通过互斥锁包围您对这对值的读取,您走在了正确的轨道上。

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

作为一般规则,是的。

于 2012-07-29T07:18:30.417 回答
0

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

于 2012-07-29T09:36:46.593 回答