在线程之间共享变量的方法
Ways to share a variable among threads
我有一个关于C和C++并行编程的一般问题,如果你能回答,我将不胜感激。据我所知,我们可以在至少一个更高级别(父线程)中声明一个变量,以便在子线程之间共享。所以,我想知道是否有其他方法可以在具有相同父线程的线程之间共享变量?这是否取决于API?
对于Posix线程,请阅读一些pthread教程。
对于C++11,请阅读其线程库的文档
同一进程的所有线程在虚拟内存中共享相同的地址空间。正如Marco A.所评论的,还可以考虑thread_local变量。
请注意,您共享数据或内存(而不是仅存在于源代码中的变量)
在实践中,您将使用互斥对象更好地保护共享数据(用于同步),以避免数据竞争。
在简单的情况下,互斥对象和共享数据位于一些全局变量中。
您也可以使用原子操作。
顺便说一句,你也可以使用一些消息传递范式来开发一个并行应用程序,例如使用MPI(或者简单地使用一些RPC或其他消息,例如套接字上的JSON)。对于常规数值应用程序,您可以考虑使用GPGPU,例如使用OpenCL。当然,您可以混合所有的方法(使用OpenCL,使用几个线程以及让并行软件在几个与MPI通信的进程中运行)。
调试一个高度并行的软件可能会成为一场噩梦。性能可能取决于硬件系统,并且可能需要进行棘手的调整。可伸缩性和同步性可能会成为一个日益关注的问题。地图减少通常是一个有用的模型。
在C++和C中,任何内存位置(由变量标识)都可以在线程之间共享。所有线程的内存空间都是相同的。内存没有父/子线程关系。
挑战在于控制或同步线程之间对内存位置的访问。
这取决于实施情况。
任何全局变量都可以在线程之间共享,因为线程是共享相同地址空间的轻量级进程。对于同步,在通过信号量或等待通知块更新/访问这些全局变量时,需要确保互斥。
- C++子类共享变量?
- 子目录之间的 CMAKE 共享变量
- 如何在不同的CMakeList.txt之间共享变量?
- OpenMP 任务看不到共享变量的更改
- 只设置一次方法中变量的值
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 在 pthread 中使用共享变量
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- C :与多个文件共享变量
- 使用共享变量进行线程处理
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- 在派生类之间复制共享变量(浅副本就足够了)
- 为什么跨线程更改共享变量的代码显然没有受到竞争条件的影响
- 从多个线程C 更改共享变量
- 在不同类的对象之间共享变量 (C++)
- 管理多线程应用程序中的共享变量
- C 类共享变量
- 增强多线程和共享变量
- 在线程之间共享变量的方法