我问这个问题是为了更好地理解 C++ 中的线程竞争现象(但这也许应该与语言无关......?)。
假设我有两个线程,具有共享资源(例如 int n
,初始值为 0)。
线程 A 工作一段时间,直到找到 n
的值,因此在某个时刻 n =/* 这里有某个值 */;
。
线程 B 正忙于等待 n
的值,例如 while(!n);
n
只会被线程 A 设置一次,并且不会改变。现在,当设置 n
时,线程 A 和 B 之间将发生竞争。然而,在这种情况下,一个线程是只写的,一个线程是只读的,所以我想知道线程 A 是否真的有可能永远不会设置 n
的值,因为竞争,从而使线程 B 永远挂起。
用一个例子来总结一下:
int n = 0;
void threadA()
{
cin>>n;
}
void threadB()
{
while(!n);
cout<<n<<endl;
}
int main()
{
// Run threadA and threadB as parallel threads. (Or run threadA as a thread and call threadB from the main thread).
}
当我为 n
输入某个值时会发生什么?
最佳答案
是的,线程 B 可能会永远陷入等待状态。原因很简单——在 C++ 中,您需要显式同步“握手”(原子操作或同步原语,例如互斥体)以确保一个线程写入的值对另一个线程可见。您的代码中没有此类同步操作,因此不能保证线程 B 会继续执行。
线程 B 完全有可能将 0 读入缓存,并且缓存行永远不会更新,只是因为没有理由这样做 — 没有原子或同步操作可以强制更新。就编译器而言,线程 B 读取 n
会导致未定义的行为,因此可以安全地假设 B 没有读取 n
。
关于c++ - 线程竞争期间读取会影响写入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29216038/