我正在编写一个面向任务的服务器应用程序。每个会话(客户端)向服务器发送数据包,服务器将它们作为任务排入队列,然后工作人员(线程)处理它们。约束是:
- 来自同一会话的任务必须始终按顺序执行(=>如果一个线程开始处理会话的任务,另一个线程无法处理同一会话的任务,而第一个任务尚未完成)
- 某些类型的任务必须按顺序执行
- 其他类型的任务不必按顺序执行
最好的方法是什么?我们如何称呼这个概念?(我猜这不是双重条件序列执行)
理想情况下,我会使用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();
}
}