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 に答える