我有一些C 代碼,其中大致包含這樣的邏輯:
class wrapper_info {
public:
bool isConnected()。
void connectedHandler();
void disconnectedHandler();
protected:
bool _connected。
}
void wrapper_info::connectedHandler() {
_connected = true;
}
void wrapper_info::disconnectedHandler() { _connected = true; }
_connected = false;
}
bool wrapper_info::isConnected() {
return _connected;
}
extern "C"
bool is_connected(void *obj){
wrapper_info *wrapper_obj = reinterpret_cast<wrapper_info*>(obj)。
return wrapper_obj->isConnected()。
}
由于大多數情況下我無法控制的原因,不同的執行緒(在不同的CPU核上運行)以如下方式呼叫這些函式。
執行緒1、2、3。is_connected(obj)
執行緒2。connectedHandler()當連接被啟動時。
執行緒3 disconnectedHandler()當連接被破壞時。
我認為在重復呼叫connectedHandler()和disconnectedHandler()的情況下可能會出現問題,兩個執行緒向_connected寫的問題和寫的順序不一致,導致最終值錯誤。還有可能是輪詢_connected的問題。
我的問題是:
- 單獨的執行緒輪詢和修改
_connected的值實際上會產生什么潛在的問題?- 有什么辦法來防止這些問題?也許讓
_connected成為volatile bool可能會解決輪詢值的問題。我還在想,對于執行緒2和執行緒3修改其值的問題,也許把它變成一個原子型的bool,并使用原子型的集合操作,就足以防止諸如記憶體操作失序的問題。我也知道其他潛在的解決方案是鎖或像smb_mb這樣的記憶體屏障。然而,我不確定我應該使用什么。 - 有什么辦法來防止這些問題?也許讓
謝謝你。
uj5u.com熱心網友回復:
單獨的執行緒輪詢和修改_connected的值,實際上會產生什么潛在的問題?
無論如何,這都是未定義的行為。
這是不確定的行為。
有什么辦法可以防止這些情況?
有什么辦法可以防止這些情況?
一個常見的解決方案是使用
std::atomic<bool>而不是bool。有一些更復雜的方法來確保執行緒之間的同步,但是
std::atomic是一個很好的首選,并且不難正確使用。也許讓_connected成為volatile bool可能會解決問題。它不會。
volatile并不能解決執行緒同步問題。轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/308315.html
標籤:
