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

假的

我想我的问题很普遍,但是却让我发疯:

我有一个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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

线程安全的缓冲区包装流

来自分类Dev

线程安全的缓冲区数组

来自分类Dev

线程安全的循环缓冲区,用于存储指针

来自分类Dev

如何从Pod创建Kubernetes作业

来自分类Dev

如何释放libjpeg创建的缓冲区?

来自分类Dev

如何添加pod 0.3.3

来自分类Dev

C- Linux- 创建线程并传入缓冲区

来自分类Dev

当Pod创建后超过Pod的限制时,Pod如何限制kubernetes上强制的资源?

来自分类Dev

Jenkins无法创建kubernetes POD

来自分类Dev

无法在Kubernetes中创建Pod

来自分类Dev

创建后添加Pod nodeSelector

来自分类Dev

创建和删除 Pod 的步骤

来自分类Dev

如何同步多线程OpenGL缓冲区访问?

来自分类Dev

创建pod,为我的pod类使用未声明的类型

来自分类Dev

删除 Pod 时创建的 Pod 数量超过指定数量

来自分类Dev

如何创建具有多个 Pod 的部署?

来自分类Dev

如何从其他Pod解析Pod主机名?

来自分类Dev

如何用Swift制作Pod

来自分类Dev

如何删除kubernetes pod的标签

来自分类Dev

如何检查每个节点的Pod

来自分类Dev

如何删除kubernetes pod的标签

来自分类Dev

如何查看终止的 Pod 的日志

来自分类Dev

如何创建缓冲区溢出以测试Address Sanitizer?

来自分类Dev

如何从音频标签创建音频缓冲区?

来自分类Dev

如何从char []创建指向缓冲区的指针

来自分类Dev

如何创建采样缓冲区(CMSampleBufferRef)的实例?

来自分类Dev

如何从char缓冲区创建long int?

来自分类Dev

如何获得WGL创建32位深度的缓冲区?

来自分类Dev

如何创建采样缓冲区(CMSampleBufferRef)的实例?