2014-10-10 72 views
0

我有一個藍牙通信線程連續更新的全局緩衝區(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(); 

有什麼根本性的錯誤是什麼我正在做?

+1

您正在使用['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

回答

1

很難說,但聽起來好像您使用兩個互斥體來保護一塊數據。這是行不通的。我們想要一個互斥量。

讓我們看一個完整的例子:

#include <thread> 

std::mutex mutex; 
int treasure; 

void worker(int value) { 
    while(true) { 
     std::lock_guard<std::mutex> lock(mutex); 
     treasure = value; 
    } 
} 

int main() { 
    auto t1 = std::thread(worker, 4); 
    auto t2 = std::thread(worker, 5); 

    t1.join(); 
    t2.join(); 
} 

注意事項:

  1. std::mutex在兩個線程之間共享。
  2. 每個線程在想要訪問共享數據時都使用std::lock_guard。您也可以使用std::unique_lock
+0

感謝您的答案和示例!在線程中執行互斥鎖時,是否會阻止主線程訪問共享數據? – kbrown 2014-10-10 23:30:34

+1

主線程就像't1'和't2'線程。所以如果它也使用'lock_guard',那就沒問題了。 – 2014-10-11 01:33:33

+0

好的。感謝您的澄清。我原本只有一個互斥體,並且正在我的線程和主線程中使用它,但它並未改變通信錯誤,所以我開始認爲它可能還有其他一些問題。回到調試.. :) – kbrown 2014-10-11 19:35:53