0

我正在编写一个面向任务的服务器应用程序。每个会话(客户端)向服务器发送数据包,服务器将它们作为任务排入队列,然后工作人员(线程)处理它们。约束是:

  • 来自同一会话的任务必须始终按顺序执行(=>如果一个线程开始处理会话的任务,另一个线程无法处理同一会话的任务,而第一个任务尚未完成)
  • 某些类型的任务必须按顺序执行
  • 其他类型的任务不必按顺序执行

最好的方法是什么?我们如何称呼这个概念?(我猜这不是双重条件序列执行

理想情况下,我会使用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();
    }
}
4

1 回答 1

0

定义一个可以保存和执行其他任务的“TaskCollection”任务。如果有顺序任务,请将它们推入 TaskCollection 并将其提交到您的线程池。

于 2013-07-23T13:54:23.540 回答