我有兩個類在同一時間在兩個線程運行,說A
類和B
類,A
正在收集來自某些API的數據,並繼續推送更新的數據爲unordered-map
作爲B->m
。在相同的時間B
使用數據來創建自定義類Bar
,代碼是這樣的:如何確保在兩個線程中寫入相同變量線程安全的兩個類?
類A
:
if(m.size() > 0){
//mtx.lock();
lock = B->lock;
if(lock == false){
lock = true;
B->m = m;
lock = false;
}
m.clear();
//mtx.unlock();
}
類B
:
while(true){
if(m.size() > 0){
//mtx.lock();
if(lock == false){
lock = true;
for (auto it : m) {
std::string symbol = it.first;
std::vector<double> v = it.second;
Bar b;
b.open = v[0];
b.high = v[1];
bars.push_back(b);
}
m.clear();
lock = false;
}
//mtx.unlock();
}}
作爲可以在這裏看到,我試過通過使用布爾值lock
手動實現互斥體,當我編譯有時它有時完成賽格故障,我認爲這是因爲邊緣情況:當我在B
類設置lock
到true
,類A
剛剛跳過if(lock == false)
和B
是讀取由真實改變A
數據。我的問題是,如何避免這種情況發生?
手動互斥體實現將不起作用。不要。如果C++ 1x使用來自pthread或'std :: mutex'的正確互斥對象。 – freakish
@怪異的,如果我使用std :: mutex,我應該在哪裏放置mutex.lock()?請參閱上面的註釋代碼,我試過但沒有工作,因爲它是兩個類中的互斥體 –
根本不要使用'mutex.lock()'。它並不是特別安全。在一段代碼中使用'std :: lock_guard'。看到我的答案。 – freakish