TaskQueue:双条件序列执行(C ++)

时间:2013-07-23 13:12:20

标签: c++ multithreading networking task-queue tbb

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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