2011-11-07 46 views
1

我的情況是一個線程讀取並且想要 決定是否需要更改值?1字節共享內存需要互斥鎖

一些事情一樣,如果這一切成爲可能低於

void set(bool status) 
{ 
    if(status == m_status) 
     return; 
    monitor.lock(); 
    m_status = status; 

} 

+0

是的,就像你這樣做了。它出什麼問題了? –

+0

我想確定。我知道,當兩個線程要寫1個字節時,這個問題就會出現。那麼我問一個線程想要讀取沒有互斥體 –

回答

3

爲布爾狀態使用同步對象是矯枉過正的。

在Windows上,您可以使用Interlocked Variable Access

對於跨平臺的解決方案..看到Boost Atomic

從C++ 11 std::atomic也是一個解決方案

+0

我敢肯定,所有這些指令工作在字大小(至少32位)的變量,而不是單個字節雖然.. – Voo

+0

如果OP要使用C中的std :: atomiC++ 11 ..它可以做bool我認爲 –

+0

parapura:你的意思是'char'(或者更好:'uint8_t',而不是bool,否則,你是對的,'std :: atomic'可以操作各種基本的整數類型 – rubenvb

2

我想你需要澄清你的問題有點。可能嗎?是。有必要嗎?大概。還有其他方法可以做到嗎?是的,正如另一個答案指出的那樣。

當你完成你想要改變的事情時,不要忘記解鎖。只是一個文體筆記,我發現使用'if'語句來包裝代碼塊而不是從函數返回更清晰。像這樣:

void set(bool status) 
{ 
    if(status != m_status) 
    { 
     monitor.lock(); 
     m_status = status; 
     monitor.unlock(); 
    } 
} 

只是我的看法,當然。

+0

我假設(希望)OP的'monitor'是一個RAII互斥體,所以不需要明確地解鎖它。 –

1

通常這是不可能的。它在大多數平臺上大部分時間都會工作,但它在形式上是未定義的,有些情況下會發現緩存一致性問題可能會導致您狩獵。

如果您可以獲得C++ 11,請使用新的<atomic>標頭中的std::atomic<bool>。如果不是,則應該使用舊版編譯器特定的等效項。 Windows有Interlocked *功能,GCC有__sync關鍵字。實際上,C++ 11標準的重要部分實際上跨越了平臺,深埋在Boost.Interprocess庫中,但不幸的是它沒有向用戶公開。