【发布时间】:2012-07-29 17:38:47
【问题描述】:
假设我有 A) 全局变量 B) 局部变量,但另一个线程有一个指向它的指针
假设我有这个代码
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 是不安全的),我该如何纠正它?
【问题讨论】:
-
在修改变量之前,您的第二个线程是否也采用相同的互斥锁?
-
请提供完整代码,我们不必猜测。
-
When calling any functions does C++ believe variables may have been modified and need to be reloaded into the register?使互斥锁工作必须做的一切都已完成。如果这就是它所需要的,那么这就是它所做的。 (实际需要做的可能是特定于平台的。它可能涉及在所有互斥操作之前使寄存器内容无效,可能不会。) -
@DavidSchwartz 我怀疑编译器会检查并为该函数/类做一些特殊的事情,因为它被称为互斥体
-
@acidzombie24:这取决于编译器。对于一些人来说,没有什么特别的需要。他们为所有外部功能执行此操作。对于某些功能,需要特定的“clobbers”。
标签: c++ multithreading