提高多部分进程的互斥使用率
Boost mutex usage for multipart processes
我有一个带有套接字通信类的c++程序。每个插座都有一个大的专用插座用于组装输出消息的缓冲区,因此用法如下:
class CSocketClass {
public:
SetMsgHeader(int n) { Mutex_.lock(); DoWhateverIsNeededToSetHeaderInBuffer(n); } // where n would be the message type
SetMsgField(double a); { DoWhateverIsNeededToSetDataInBuffer(a); } // where a would be some arbitrary content
SendMsg(); { DoWhateverIsNeededToSendBuffer(); Mutex_.unlock(); } // where this would send the number of bytes added to the buffer since the header was set
private:
char buffer[reallylarge];
MiscSocketApparatus...
boost::mutex Mutex_;
};
多个线程可能正在尝试发送消息,每个线程由三个或多个调用组成——设置头、内容,最后在途中发送消息。为了避免它们之间的冲突,我试图通过使用Mutex一次只保留一个作家。所需的行为是阻止第二个到达的写入程序,直到第一个到达的写程序解锁互斥锁。然后被阻止的写入程序将能够继续。
这似乎在大多数情况下都有效,但在极少数情况下(并非每天),死锁似乎仍然会发生。
我更熟悉使用作用域锁的更简单的锁问题,但这些概念可能无法完美地转化为这个问题,在这个问题中,锁需要在对拥有锁的对象的多次调用中保持持久性。
通过阅读Boost同步教程,我认为有更好的方法可以做到这一点,但不清楚什么是最好的。
如有任何建议,我们将不胜感激。
由于每个线程都有自己的缓冲区,因此让每个线程在自己的缓冲区时构建完整的消息,然后锁定互斥并发送消息。
更好的是,有一个线程来实际调度消息,有N个线程来创建消息。在两者之间放置一个线程安全的队列,这样线程就会创建一条消息,将其放入队列中,然后(如果需要)返回创建另一条消息。消息发送器只是不断地等待队列中的消息,检索、发送并重复。
您可能还想要一个线程安全的缓冲区集合,因此在发送消息时,发送线程可以将缓冲区放在消息生成器线程可以在需要时再次使用的位置。
顺便说一句:对于缓冲区,我会使用std::string
或std::vector
,而不是原始数组。
相关文章:
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 终止 QProcess 不会终止子进程
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- Windows 进程间同步类似事件?
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- Linux:如何测量进程中线程的内存使用率
- 提高多部分进程的互斥使用率
- C、 所有平台中进程的C++CPU使用率和内存使用率+当前时间的可用网络下行链路带宽
- 如何计算Linux中多进程应用程序的CPU使用率
- 是否有库或工具可以计算Linux下C/ c++中不同进程的cpu使用率和其他一些参数?