在线程之间共享变量的方法

Ways to share a variable among threads

本文关键字:方法 共享变量 之间 线程      更新时间:2023-10-16

我有一个关于C和C++并行编程的一般问题,如果你能回答,我将不胜感激。据我所知,我们可以在至少一个更高级别(父线程)中声明一个变量,以便在子线程之间共享。所以,我想知道是否有其他方法可以在具有相同父线程的线程之间共享变量?这是否取决于API?

对于Posix线程,请阅读一些pthread教程。

对于C++11,请阅读其线程库的文档

同一进程的所有线程在虚拟内存中共享相同的地址空间。正如Marco A.所评论的,还可以考虑thread_local变量。

请注意,您共享数据或内存(而不是仅存在于源代码中的变量)

在实践中,您将使用互斥对象更好地保护共享数据(用于同步),以避免数据竞争。

在简单的情况下,互斥对象和共享数据位于一些全局变量中。

您也可以使用原子操作。

顺便说一句,你也可以使用一些消息传递范式来开发一个并行应用程序,例如使用MPI(或者简单地使用一些RPC或其他消息,例如套接字上的JSON)。对于常规数值应用程序,您可以考虑使用GPGPU,例如使用OpenCL。当然,您可以混合所有的方法(使用OpenCL,使用几个线程以及让并行软件在几个与MPI通信的进程中运行)。

调试一个高度并行的软件可能会成为一场噩梦。性能可能取决于硬件系统,并且可能需要进行棘手的调整。可伸缩性和同步性可能会成为一个日益关注的问题。地图减少通常是一个有用的模型。

在C++和C中,任何内存位置(由变量标识)都可以在线程之间共享。所有线程的内存空间都是相同的。内存没有父/子线程关系。

挑战在于控制或同步线程之间对内存位置的访问。

这取决于实施情况。

任何全局变量都可以在线程之间共享,因为线程是共享相同地址空间的轻量级进程。对于同步,在通过信号量或等待通知块更新/访问这些全局变量时,需要确保互斥。