我想我的问题很普遍,但是却让我发疯:
我有一个5线程的多线程应用程序。这些线程中的4个完成其工作,例如网络通信和本地文件系统访问,然后全部将其输出写入以下形式的数据结构:
struct Buffer {
std::vector<std::string> lines;
bool has_been_modified;
}
第五个线程将这些缓冲区/结构打印到屏幕上:
Buffer buf1, buf2, buf3, buf4;
...
if ( buf1.has_been_modified ||
buf2.has_been_modified ||
buf3.has_been_modified ||
buf4.has_been_modified )
{
redraw_screen_from_buffers();
}
在读取或写入缓冲区时如何保护缓冲区不被覆盖?
尽管我认为这必须是一个安静的常见问题,但我找不到合适的解决方案。
谢谢。
您应该使用互斥锁。互斥锁类为std::mutex
。在C ++ 11中,您可以使用std::lock_guard<std::mutex>
RAII封装互斥体。因此,您可以将Buffer
结构更改为
struct Buffer {
std::vector<std::string> lines;
bool has_been_modified;
std::mutex mutex;
};
每当你读或写的缓冲区或has_been_modified
你会做
std::lock_guard<std::mutex> lockGuard(Buffer.mutex); //Do this for each buffer you want to access
... //Access buffer here
互斥体将在lock_guard
销毁时自动释放。
您可以在此处阅读有关互斥锁的更多信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句