我有一个全局缓冲区(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();
}
需要注意的事项:
std::mutex
在两个线程之间共享- 当每个线程想要访问共享数据时,它都使用一个
std::lock_guard
。您也可以使用std::unique_lock