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

问题描述 投票:0回答:1

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

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和J类型的消息。我不关心它们的处理顺序,因此多线程处理是完美的。但是,我确实需要按顺序处理相同类型的消息。假设我按以下顺序收到了消息。

1,E1,F1,A1,B1,2,B2,D1,D2,F2,A2,X1,X2,Az,E2,Ez,Fz

这里,字母表是类型,数字是它们到达的顺序。可以按任何顺序并行处理不同的消息类型,应保持类型内的序列。我希望在A2之前处理A1,在A3之前处理A2。每种消息类型都相同。

其中一种方法是确保给定类型的消息始终转到同一个线程。效率不高。如果我只有5种消息类型和32个CPU核心,我仍将限制为5个线程。是否可以强制某个项目由特定线程处理?否则我必须为每个线程维护一个队列,处理互斥锁定等。

有没有更好的方法?

c++ multithreading boost-asio
1个回答
1
投票

您可以将strand用于每种类型的工作作为队列。这样,您的工作可以均匀地分布在io_context线程上,并为每种类型的工作提供顺序工作队列,并且不需要任何互斥锁定。

© www.soinside.com 2019 - 2024. All rights reserved.