【发布时间】:2021-03-15 15:16:20
【问题描述】:
正如标题所暗示的 - 在 C++ 中,如何处理线程中对共享变量的写入?线程是否使用它们自己的数据副本?我知道线程之间共享什么,什么不是,但我找不到关于在多线程场景中如何处理对变量的写入的任何信息。
让我给你一点背景。在 Java 中,线程处理它们自己的数据副本。我们添加同步以确保线程的写入对其他线程可见。简而言之,同步可确保将写入刷新到主内存。
类似的结构对 c/c++ 有效吗?如果一个线程正在写入一个变量,这些写入是否会立即更新到主内存,或者是操作系统控制如何写入主内存?我们是否需要添加同步来刷新这些更新?
例如如果两个线程正在递增一个计数器,我可以保证第一个线程总是首先完成该特定任务(不知何故,通过使用第二个线程的延迟启动,在实践中可能无法保证)并且不会有两个线程之间的任何指令混乱,那么我是否总是能看到两个线程的影响?
Thread 1 { i++; ... do something that takes long time}
Thread 2 { i++; ... do something that takes long time}
谢谢, RG
【问题讨论】:
-
在 Java 中,线程不能处理它们自己的数据副本。在 Java 中,您需要同步以避免线程同时访问相同的数据,因为这样做会导致崩溃。这同样适用于 C++。
-
请注意,您不使用任何同步,您可能很容易遇到在 C++ 中导致 未定义行为 的 数据竞争。例如,
i的类型为int并且其增量不受互斥体保护时就是这种情况。如果i是std::atomic<i>类型,那么,你很好。
标签: c++ multithreading operating-system