タスク指向のサーバー アプリケーションを作成しています。各セッション (クライアント) はパケットをサーバーに送信し、サーバーはそれらをタスクとしてキューに入れ、ワーカー (スレッド) がそれらを処理します。制約は次のとおりです。
- 同じセッションのタスクは常に順次実行する必要があります (=> スレッドがセッションのタスクの処理を開始した場合、最初のセッションが終了していない間、別のスレッドは同じセッションのタスクを処理できません)。
- 一部のタイプのタスクは順次実行する必要があります
- 他のタイプのタスクは、順次実行する必要はありません
それを行うための最良のアプローチは何ですか?この概念をどのように呼びますか? (条件付き二重実行じゃないのかな)
理想的には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();
}
}