如何创建线程安全缓冲区/ POD?

dum*_*mmy 13 c++ multithreading c++11

我想我的问题很常见,但它让我发疯:

我有一个包含5个线程的多线程应用程序.其中4个线程完成它们的工作,如网络通信和本地文件系统访问,然后将它们的输出写入此表单的数据结构:

struct Buffer {
  std::vector<std::string> lines;
  bool has_been_modified;
}
Run Code Online (Sandbox Code Playgroud)

第5个线程将​​这些缓冲区/结构打印到屏幕:

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();
}
Run Code Online (Sandbox Code Playgroud)

如何保护缓冲区在被读取或写入时不被覆盖?

我找不到合适的解决方案,虽然我认为这必须是一个安静的常见问题.

谢谢.

pha*_*tom 10

你应该使用互斥锁.互斥体类是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;
};
Run Code Online (Sandbox Code Playgroud)

无论何时你读或写缓冲区,或者has_been_modified你会这样做

std::lock_guard<std::mutex> lockGuard(Buffer.mutex); //Do this for each buffer you want to access
... //Access buffer here
Run Code Online (Sandbox Code Playgroud)

并且互斥锁将在lock_guard被销毁时自动释放.

您可以在此处阅读有关互斥锁的更多信息.


lcs*_*lcs 5

您可以在缓冲区周围使用一个或多个互斥锁,以确保多个线程不能同时修改它们。

// Mutex shared between the multiple threads
std::mutex g_BufferMutex;

void redraw_screen_from_buffers()
{
   std::lock_guard<std::mutex> bufferLockGuard(g_BufferMutex);
   //redraw here after mutex has been locked.
}
Run Code Online (Sandbox Code Playgroud)

然后,在修改缓冲区时,缓冲区修改代码将必须锁定相同的互斥锁。

void updateBuffer()
{
   std::lock_guard<std::mutex> bufferLockGuard(g_BufferMutex);
   // update here after mutex has been locked
}
Run Code Online (Sandbox Code Playgroud)

其中包含一些互斥锁示例。