如何在多个线程之间同步.只有一个是写作
How to synchronize between many threads. Only one is writing
进程在其生命周期内有 1 个主线程和 1 到 50 个其他工作线程。当主线程接受新连接时,它会将其保存在 boost::unordered_map 中,我们称之为"新容器"。工作线程不时检查"新容器"是否有新连接。出于同步目的,有一个提升::互斥。当主线程写入"新容器"时,它会锁定此互斥锁。检查此容器时的工作线程也会锁定互斥锁。
工作线程有没有办法不锁定互斥锁并从"新容器"中线程安全读取?工作线程在套接字上执行实时操作,因此锁定互斥锁会影响性能。
如果您有单个编写器和多个读取器,请考虑使用 shared_mutex:
类 boost::shared_mutex 提供了 多读取器/单写入器互斥锁。
与其由工作线程轮询"新容器",不如使用条件变量让工作线程阻塞,直到其中一个线程执行某些操作。这将减少争用,从而减少锁的开销。
此外,您还可以对容器进行分区。与其拥有一个容器,不如使用更多容器并为每个容器分配一组固定的线程。然后,主线程会将每个新连接推送到不同的容器。
亲切问候托斯滕
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 有一个构造函数,但有两个析构函数
- 给一个c++类foo,里面有一个同步方法.如何保证同步方法只能被一个线程访问