让我说我有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是不安全的),我该怎么纠正呢?
答案 0 :(得分:2)
你做的事情要复杂得多。您的责任是确保不会发生对变量的冲突访问。
定义:对给定内存位置的两次访问冲突 iff 它们可以同时发生,至少一次是写访问。
所以:
要确保永远不会发生这种情况,您可以使用mutex
,或者设计程序,以便只读取线程之间共享的变量。还有许多其他可能的策略。
如果我正确理解了您的不完整代码:localVar
在两个线程中同时修改。 未定义行为。任何事情都可能发生。
答案 1 :(得分:0)
这是正确和安全的吗?
没有
修复:在创建第二个线程之前初始化localVar和globalVar。
你已经将localVar(在本地堆栈上?local var在堆栈中建议)暴露给另一个线程很麻烦。如果这个localVar在堆栈上,那么请确保你不要让它超出范围。
您是否在另一个线程上使用相同的互斥锁,以保护读/写访问权限?如果是,那么这将走向安全。
这不是“C ++知道localVar和globalVar可能已被修改过吗?”的问题:C ++不知道。对于这种情况,如上所述,所有关于使用互斥锁来正确保护对所有共享值的所有访问都是如此。如果两个线程都使用互斥锁,则一次只允许一个线程通过受保护的代码。试图锁定互斥锁的任何其他线程将“停止并等待”,直到锁定被释放。
因此,通过使用互斥锁读取这对值,您就处于正确的轨道上。
当调用任何函数时,C ++是否认为变量可能已被修改并需要重新加载到寄存器中?
作为一般规则,是的。
答案 2 :(得分:0)
我认为第一次获取本地变量的地址时,它变得易变,并且所有读写都在内存中执行。