在互聯網之間進行通信,可以找到關於並行編程使用volatile
關鍵字的許多爭論,有時相互矛盾的論證。使用標誌線
一本主題更值得信賴的討論似乎是this article by Arch Robison。他使用的例子是從一個線程傳遞一個值到另一個任務:
主題1.計算矩陣乘積,並賦予其主題2,這確實其他的東西吧。該矩陣是可變的M
並且該標誌是volatile
指針R
。
- 線程1相乘計算一積矩陣M和原子設置 R鍵指向M.
- 線程2個等待,直到ř!= NULL,然後使用中號,以計算另一矩陣乘積的一個因素。
換句話說,M是一個消息,並且R是就緒標誌。
作者聲稱,雖然將R聲明爲volatile將解決將線程1中的變化傳播到線程2的問題,但不會保證M發生這種情況時的值。並且可以對R
和M
的分配進行重新排序。所以我們需要使M
和R
不穩定,或者在像pthreads這樣的庫中使用一些同步機制。
我的問題是,如何做到用C
1)以下如何共享兩個線程之間的一個標誌 - 如何原子分配給它,確保其他線程將看到變化和測試在另一個線程中的變化。在這種情況下使用易變的合法嗎?或者一些圖書館可以提供一個概念上更好或更快的方式,可能涉及記憶障礙?
2)如何做羅賓遜的例子吧,所以如何從一個線程安全地並行線程發送矩陣M到其他並做到這一點(最好是可移植的)
爲了迴應你第一個問題中的最後一句話,安迪羅賓遜說這兩個變量對於*兩邊都應該是易變的,因爲易變也會阻止賦值語句和矩陣的重新排序。但我認爲你爲了簡單而將這個重新排序的問題拋出去了。 – user7610 2012-02-28 12:54:09
一個矩陣,特別是在一個多線程應用程序中,它預計在線程之間進行通信,可能會動態分配並通過其指針進行訪問。指針通常是寄存器大小:( – 2012-02-28 13:01:22
)如果發送方重新使用矩陣或指針,則只需在發送方有一個volatile。重新排序是一個獨立的問題,因爲Necrolis聲明,在C11中,您可以使用_Atomic。 – Matthias 2012-02-28 13:11:56