2013-10-20 35 views
1

如何自動設置一個字節的位?我試圖解決的問題涉及更新大量字節,例如uchar數據[262144]。我使用SET(索引,值)一次只設置一個字節的2位,這意味着四個線程可以同時在一個字節中設置值。線程選擇相同的字節進行更新是非常罕見的,但它確實發生了。什麼是使這些操作線程安全的最有效方式?請注意,我無法對每個數據條目使用一個太大而且太慢的鎖。字節數組中的原子集位

更糟糕的是,有時需要以線程安全的方式同時更新另一個字節數組data1 [131072]。但我打算合併這兩個數組來簡化問題,所以更新第一個數組的原子方式就足夠了。

+0

比方說,維護一個單獨的每線程數據副本,然後在最後合併是否可行? –

+0

不幸的是沒有。大多數時候線程訪問分區中的數據,但他們也訪問和更新其他分區。 – danny

+0

如果「其他分區」更新只是偶爾的,請求所有者線程進行更新如何?這可能具有較低的攤銷成本。 –

回答

2

您必須使用CompareExchange基元。你需要編寫什麼,取決於編譯器和平臺。但是,理論上,它看起來像下面這樣。

假設CompareExchange返回oldvalue,並且只有在oldvalue未更改時才自動更改值。

 

    do { 
     oldvalue = bitset; 
     newvalue = oldvalue|bitvalue; 
    } while (oldvalue != CompareExchange(&bitset,newvalue,oldvalue)); 

由於CompareExchange是原子性的,它會自動設置位。但是,您只能以最大一個處理器字大小的位進行原子級設置。