這種情況總是頻繁發生:我們有一些線程和一個共享對象,我們需要確保在任何時候只有一個線程可以修改該對象。互斥守衛:有沒有對象的自動保護機制?
那麼,顯而易見的解決方案是使用lock the door-do the job-get out of there
成語。在這種情況下,我總是使用POSIX互斥鎖。例如
pthread_mutex_lock(&this->messageRW); // lock the door
P_Message x = this->messageQueue.front(); // do the job
this->messageQueue.pop();
pthread_mutex_unlock(&this->messageRW); // get out of there
// somewhere else, in another thread
while (true) {
P_Message message;
solver->listener->recvMessage(message);
pthread_mutex_lock(&(solver->messageRW)); // lock the door
solver->messageQueue.push(message); // do the job
pthread_mutex_unlock(&(solver->messageRW)); // get out of there
sem_post(&solver->messageCount);
}
我在代碼這麼多的地方使用messageQueue
。所以最後有很多不合適的鎖/解鎖對。我認爲應該有一種方法將messageQueue
聲明爲應該在線程之間共享的對象,然後線程API可以處理鎖定/解鎖。我可以考慮一個包裝類,或類似的東西。儘管其他API(boost線程或其他庫)也是可接受的,但基於POSIX的解決方案更受歡迎。
你會在類似的情況下執行什麼?
更新未來的讀者
我發現this。我猜想會成爲C++ 14的一部分。
爲什麼不創建一個包含互斥體和消息隊列的類,並公開用於訪問隊列的公共函數,並在這些公共函數中獲取並釋放該互斥體。這會從客戶端代碼中刪除獲取/釋放。 – hmjd
檢查例如['的std :: lock_guard'](http://en.cppreference.com/w/cpp/thread/lock_guard)。 –
@hmjd是的。這就是我提到的「包裝類方式」 –