c++ - 线程竞争期间读取会影响写入吗?

标签 c++ multithreading

我问这个问题是为了更好地理解 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/

相关文章:

java Timer TimerTask多线程

c++ - 使用 GCC 在 Linux 中使用库编译命令行

c++ - VLC 命令行音频/视频流

c++ - 错误 : g++. exe : No such file or directory g++. exe : fatal error: no input files in Visual studio code?

c++ - while循环不断重复

java - 如何从 JFrame 中删除 JPanel?

c - 在 C 中运行并发线程?

c++ - 无法将 std::wstring 写入 wofstream

Java:捕获异常是异步的吗?

c# - 背景工作人员忙个不停