提问者:小点点

C++多线程-如何处理对共享变量的写操作


如标题所示--在C++中,如何处理对线程中共享变量的写操作?线程使用它们自己的数据副本吗?我知道线程之间有哪些共享,哪些不共享,但我找不到任何关于在多线程场景中如何处理对变量的写操作的信息。

让我给你一点背景。在Java中,线程处理它们自己的数据副本。我们添加同步来确保线程的写入对其他线程是可见的。简而言之,同步确保写入刷新到主存储器。

类似的构造是否适用于C/C++?如果一个线程正在写一个变量,这些写操作是立即更新到主存,还是由操作系统来控制如何写到主存?我们需要添加同步来刷新那些更新吗?

例如,如果两个线程正在递增一个计数器,并且我可以保证第一个线程将总是首先完成该特定任务(通过使用第二个线程的延迟启动,在实践中可能无法保证它),并且两个线程之间的指令不会有任何混乱,那么我是否总是看到两个线程的影响?

Thread 1 { i++; ... do something that takes long time}
Thread 2 { i++; ... do something that takes long time}

谢谢,RG


共2个答案

匿名用户

C++不能保证读/写和刷新内存的原子性如何工作,除非您使用原子原语,如std::atomic。在这里要非常小心。无锁编程很难做到正确。

我建议是使用锁。

匿名用户

线程使用它们自己的数据副本吗?

不,除非数据声明为thread_local

同步确保写入刷新到主存储器。类似的构造是否适用于C/C++?如果一个线程正在写一个变量,这些写操作是否会立即更新到主内存中

是的,但是除非您使用某种类型的同步,否则更改可能会被其他线程看到,也可能不会被其他线程读错。

我们需要添加同步来刷新那些更新吗?

是的,但我不确定我会用同花顺这个词。“同步”是好的。

例如,如果两个线程都在递增一个计数器,我可以保证第一个线程总是先完成。。。

如果你能保证这一点,你就有了同步。

我会一直看到两个线程的影响吗?

是的,如果你有你所说的保证。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|多线程|共享|变量|写|操作)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?