2011-09-15 90 views
1

我有下面的代碼訪問的變量與不同步

int i; //gobal var 

Thread1: 
{ 
... 
    i=some value; 
} 

Thread2: 
{ 
    if (i==2) dosomething(); 
    else dosomethingelse(); 
    i = 4; 
} 

我想寫它是線程安全的,而無需使用同步對象和C++標準的方式。

我的問題是如何有一個變量讀取/寫入不同線程訪問使用同步?我的要求是有一個布爾變量,可以有真或假。

揮發性變量是原子。

請注意,我不應該使用任何圖書館,如具有原子變量的TBB。

提出這個問題的原因是,我們不希望每次訪問線程中的變量時都要釋放和釋放semphore,因爲這個變量並不經常更改。

+3

閱讀Boost Atomics和C++ 0x線程規格。 '我想把它寫成線程安全的,而不使用同步對象'sic,其他任何_want_ :) - 你可以爲不同的安全定義。如果模糊程度足夠好,並且您的代碼偶爾可以處理讀取「幻影」值,則只要有一個作者,就不需要鎖定。 (這可能對實時監控機制有用)。另外如果一個變量不會經常變化,它似乎是條件變量的一個好候選。 – sehe

+0

可以用簡單的例子來展示如何在上面的場景中使用條件變量。我的理解是條件變量塊,而不是前進,但我想循環 – venkysmarty

+1

有多少線程正在讀取變量,有多少線程可能會改變它? – NPE

回答

0

那麼你的代碼現在沒有任何意義。成爲你基本上說#

Thread2: 
{ 
    if (i==2) dosomething(); 
    //let's do something if i is 2 at the moment I am reading it. 
    else dosomethingelse(); 
    i = 4; 
}` 

沒關係。但如果你正在做一些與i,那麼你有麻煩。 如果不是,並且如果您詢問訪問i是否爲原子,它取決於CPU架構。例如對於x86和x64,它是原子的。閱讀this

+0

實際上,我給出的只是我的項目製作的簡單代碼,基本上我有兩個線程一個正在讀取,另一個正在寫入 – venkysmarty

+0

@venkysmarty:'dosomething()'和'dosomethingelse '?他們是否使用全局變量'i'? 'dosomething(){std :: cout << i <<「\ n」;}'? –