多线程处理,同时保持部分序列

Multithreaded processing while maintaining partial sequence

本文关键字:持部 多线程处理      更新时间:2023-10-16

我有一个消息处理逻辑如下:

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线程上,并为每种类型的工作提供顺序工作队列,并且不需要任何静音锁定。