std::thread and std::mutex issue



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

目前,我的蓝牙线程围绕缓冲区更新执行互斥锁()和解锁()。当我访问数据时,我的主线程中也有另一个互斥锁lock()和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();

我所做的事情有什么根本性的问题吗?

这很难说,但听起来像是在使用两个互斥对象来保护一段数据。那行不通。我们想要一个互斥。

让我们看一个完整的例子:

#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

最新更新