我的情況是一個線程讀取並且想要 決定是否需要更改值?1字節共享內存需要互斥鎖
一些事情一樣,如果這一切成爲可能低於
void set(bool status)
{
if(status == m_status)
return;
monitor.lock();
m_status = status;
}
?
我的情況是一個線程讀取並且想要 決定是否需要更改值?1字節共享內存需要互斥鎖
一些事情一樣,如果這一切成爲可能低於
void set(bool status)
{
if(status == m_status)
return;
monitor.lock();
m_status = status;
}
?
爲布爾狀態使用同步對象是矯枉過正的。
在Windows上,您可以使用Interlocked Variable Access。
對於跨平臺的解決方案..看到Boost Atomic
從C++ 11 std::atomic
也是一個解決方案
我想你需要澄清你的問題有點。可能嗎?是。有必要嗎?大概。還有其他方法可以做到嗎?是的,正如另一個答案指出的那樣。
當你完成你想要改變的事情時,不要忘記解鎖。只是一個文體筆記,我發現使用'if'語句來包裝代碼塊而不是從函數返回更清晰。像這樣:
void set(bool status)
{
if(status != m_status)
{
monitor.lock();
m_status = status;
monitor.unlock();
}
}
只是我的看法,當然。
我假設(希望)OP的'monitor'是一個RAII互斥體,所以不需要明確地解鎖它。 –
通常這是不可能的。它在大多數平臺上大部分時間都會工作,但它在形式上是未定義的,有些情況下會發現緩存一致性問題可能會導致您狩獵。
如果您可以獲得C++ 11,請使用新的<atomic>
標頭中的std::atomic<bool>
。如果不是,則應該使用舊版編譯器特定的等效項。 Windows有Interlocked
*功能,GCC有__sync
關鍵字。實際上,C++ 11標準的重要部分實際上跨越了平臺,深埋在Boost.Interprocess庫中,但不幸的是它沒有向用戶公開。
是的,就像你這樣做了。它出什麼問題了? –
我想確定。我知道,當兩個線程要寫1個字節時,這個問題就會出現。那麼我問一個線程想要讀取沒有互斥體 –