std :: thread和std :: mutex问题

时间:2014-10-10 22:50:32

标签: c++ multithreading

我有一个全局缓冲区(uint8_t dataBuffer []),蓝牙通信线程正在不断更新。在任何给定时间,我的主程序线程都可以访问相同的数据缓冲区。问题是如何阻止主线程访问缓冲区而另一个线程正在更新缓冲区,反之亦然?

目前我的蓝牙线程在缓冲区更新周围执行互斥锁()和解锁()。我在我的主线程中有另一个互斥锁()和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 个答案:

答案 0 :(得分: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