2014-10-02 52 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

任何全局變量都可以在線程中共享,因爲線程是共享相同地址空間的輕量級進程。對於同步,您需要確保互斥,同時通過信號量或等待通知塊更新/訪問這些全局變量。