我正在编写一个面向任务的服务器应用程序。每个会话(客户端)将数据包发送到服务器,服务器将它们作为任务排队,工作者(线程)处理它们。 约束是:
这样做的最佳方法是什么?我们如何称呼这个概念?(我猜它不是双条件序列执行)
理想情况下,我会使用TBB来实现这一目标,但我不知道TBB的功能是否符合我的需要。 (我对任何其他命题持开放态度)
这里有一段“伪代码”,这是我的第一个想法 [编辑:但是错了,顺序执行不确定,但代码可以解释我的想法] :
struct Session {
atomic<bool> locked;
}
struct Task {
char type;
Session* session;
void execute() { ; }
};
atomic<bool> type_locked[SEQ_TYPE_NUMBER];
threadsafe_selfiterable_list<Task> list;
void do() {
while( alive )
{
if( list.empty() )
relax();
if( list.has_next() ) {
task = list.next();
if( !compare_and_swap( task.session->locked, true ) ) {
if( is_non_sequential_task_type( task.type ) ) {
queue.pop();
task.execute();
} else if( !compare_and_swap( type_locked[task.type], true ) ) {
queue.pop();
task.execute();
type_locked[task.type] = false;
}
task.session->locked = false;
}
} else
list.rewind();
}
}
答案 0 :(得分:0)
定义一个可以保存和执行其他任务的'TaskCollection'任务。如果有顺序任务,请将它们推送到TaskCollection并将其提交给您的线程池。