我有一个全局缓冲区(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();
我正在做的事情是否存在根本性的错误?
答案 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();
}
注意事项:
std::mutex
在两个主题之间共享。std::lock_guard
。您也可以使用std::unique_lock
。