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

时间:2014-10-02 15:57:06

标签: c++ c multithreading

我对C和C ++中的并行编程有一个普遍的问题,如果你能回答它,我会很感激。据我所知,我们可以在一个更高级别(父线程)中声明一个变量,以在子线程之间共享它。所以,我想知道是否有任何其他方法在具有相同父线程的线程之间共享变量?这个API是否依赖?

3 个答案:

答案 0 :(得分:11)

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

对于C++11,请阅读其thread library

的文档

同一threads的所有process分享address space中的相同 virtual memory。正如Marco A.所评论的那样,还要考虑thread_local个变量。

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

实际上,您最好使用mutex共享数据(用于同步)来保护,以避免data races

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

您还可以使用atomic操作。

顺便说一下,你也可以使用一些message passing范例开发一个并行应用程序,例如:使用MPI(或简单地使用一些RPC或其他消息,例如套接字上的JSON)。您可以考虑使用常规数字应用程序来使用GPGPU,例如使用OpenCL。当然,您可以混合使用所有方法(使用 OpenCL ,使用多个线程,并在多个此类进程中运行并行软件与MPI进行通信)。

调试高度并行的软件可能会成为一场噩梦。性能可能取决于硬件系统,可能需要棘手的调整。 scalabilitysynchronization可能会成为一个越来越受关注的问题。map-reduce通常是一个有用的模型。

答案 1 :(得分:6)

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

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

这是依赖于实现的。

答案 2 :(得分:1)

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