多线程处理,同时保持部分序列
Multithreaded processing while maintaining partial sequence
我有一个消息处理逻辑如下:
boost::asio::io_service ioService;
boost::thread_group threadPool;
// Initialization code.
int noOfCores = boost::thread::hardware_concurrency();
for (int i = 0 ; i < noOfCores ; i ++)
{
threadPool.create_thread(boost::bind(&boost::asio::io_service::run, , &ioService));
}
稍后在套接字阅读线程中,我在绑定接收消息时接收消息并发布处理程序功能。
ioService.post(boost::bind(MessageHandler, message));
上线确保可以同时处理多个消息。但是,它也失去了有时可能需要的顺序处理。实际上,由于消息的处理时间可能会大不相同,因此序列完全混乱。
例如,假设我有A,B,C,D,E,F,G,H,I&amp;J.我不在乎它们的处理顺序,因此多线程处理是完美的。但是,我确实需要按顺序处理的相同类型的消息。假设我按以下顺序收到消息。
c1,e1,f1,a1,b1,c2,b2,d1,d2,d2,a2,a2,h1,h1,h2,a3,a3,e2,e3,f3
在这里,字母是类型,数字是它们到达的序列。可以按任何顺序并行处理不同的消息类型,该类型中的序列应维护。我希望在A2之前对A1进行处理,而A2在A3之前进行了处理。每个消息类型都一样。
可能是一种方法,以确保给定类型的消息始终属于同一线程。这不是很高效。如果我只有5种消息类型和32个CPU内核,则我仍然会限制5个线程。是否可以强迫特定线程处理的项目?否则,我必须保持每个线程的队列,处理静音锁定等。
有更好的方法吗?
您可以将每种类型的作品用作队列。这样,您的工作就可以均匀地分布在io_context线程上,并为每种类型的工作提供顺序工作队列,并且不需要任何静音锁定。
相关文章:
- 多线程处理中的静态成员变量
- Opencv cpp 使用多线程处理同一视频的不同部分
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- 使用 wxWidgets 进行多线程处理时出现奇怪的行为
- 通过多线程处理确定每个字符在文件中出现的次数
- 使用多线程处理的异步请求
- 多线程处理,同时保持部分序列
- 如何在类中进行 c++ 多线程处理(将线程引用保留为成员 var)
- SDL 带变量的多线程处理 -- 无法按预期工作
- 使用多线程处理对象数组 - 无效使用 void 表达式错误
- 如何使用"priority"进行多线程处理?
- 使用简单的过程进行慢速多线程处理
- C++11 使用共享对象的多线程处理
- 在多线程处理时将参数传递给函数
- 使用 vfork 进行多线程处理
- C++ 多线程处理速度慢
- 在 c++ 中多线程处理时与 cout 和 printf 的区别
- 使用windows.h库中函数的多线程处理
- 具有重载成员函数的多线程处理
- 将 rng 的列表存储在 std::array 中以进行多线程处理