我有一個藍牙通信線程連續更新的全局緩衝區(uint8_t dataBuffer [])。在任何時候,我的主程序線程都可以訪問這個相同的數據緩衝區。問題是如何防止主線程訪問緩衝區,而其他線程正在更新它,反之亦然?std ::線程和std ::互斥問題
此刻,我的藍牙線程在緩衝區更新周圍執行互斥鎖()和解鎖()。當我訪問數據時,我的主線程還有另一個互斥鎖()和unlock(),但這似乎無法正常工作。出於某種原因,我不斷收到很多校驗和錯誤,我很肯定來自線程問題,因爲我有另一個單線程測試應用程序,它幾乎完美地與同一設備進行通信。
這是削減什麼,我在我的通信線程做版本:
uint8_t dbuf[14];
while(1)
{
if(!run)
break;
// Read data... //
mtx1.lock();
memcpy(dataBuffer, dbuf, 14);
mtx1.unlock();
}
而在我的主線程我有這樣的事情:
mtx2.lock();
// Do something with dataBuffer
mtx2.unlock();
有什麼根本性的錯誤是什麼我正在做?
您正在使用['std :: mutex'](http://en.cppreference.com/w/cpp/thread/mutex)不正確。你想創建一個互斥體並跨線程共享。 ['std :: lock_guard'](http://en.cppreference.com/w/cpp/thread/lock_guard)是鎖定互斥鎖的RAII安全方式,如果你想使用它的話。 – Jason 2014-10-10 23:11:41