2014-10-02 51 views
1

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

+1

您还可以通过[消息传递](http://en.wikipedia.org/wiki/Message_passing)系统交易信息跨线程,这些信息可能非常适合您想要的变量值或地址分享 – Drax 2014-10-02 16:03:52

+0

这里的两个主要问题是:a。是要写入的“共享”变量?湾这很关键吗?我可以在启动我的线程之前定义一个全局的init,并将它用作只读(糟糕的设计,但工作原理)。另外,如果我更新它,并且其他线程中的值并不重要(例如,我仅将它用作调试查看器),我可以再次使用它。如果它很重要并且需要改变,那么存在一个问题 - C++内存模型(或缺乏它)。请参阅Basile针对每个版本/实现的答案。 – Fox 2014-10-02 16:15:27

+0

我更想找到可以声明共享数据(变量)的地方。无论使用哪个并行编程API,它都必须至少比想要共享它的线程高一级。对? – user3684042 2014-10-02 16:38:21

回答

11

对于Posix线程,请阅读pthread tutorial

对于C++11,读取其thread library

所有threads相同process份额相同address spacevirtual memory的文档。如Marco A.所述,也可考虑thread_local变量。

您共享数据或 memory(不变量,它们只存在于源代码)

在实践

注意,你会更好地与一个mutex共享数据(同步)保护,以避免data races

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

您也可以使用atomic操作。

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

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

+2

也许也是相关的:[thread_local](http://en.cppreference.com/w/cpp/language/storage_duration)(TLS标准强制执行) – 2014-10-02 16:19:52

+0

我更期待共享数据(变量)可以声明。无论使用哪个并行编程API,它都必须至少比想要共享它的线程高一级。对? – user3684042 2014-10-02 16:36:05

+0

* *变量*是源代码中的文本内容。重要的是记忆位置。 (考虑递归函数中的局部变量以查看差异)。 – 2014-10-02 16:50:09

6

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

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

这是依赖于实现。

1

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