Я пишу серверное приложение, ориентированное на задачу. Каждый сеанс (клиент) отправляет пакеты на сервер, сервер ставит их в очередь как Задачи, а рабочие (потоки) обрабатывают их. Ограничения:
- Задачи из одного и того же сеанса должны быть всегда последовательно выполняться (=> если поток начинает обрабатывать задачу сеанса, другой поток не может обрабатывать задачу для того же сеанса, пока первый не завершен)
- Задачи некоторых типов должны выполняться последовательно
- Задачи другого типа не обязательно должны выполняться последовательно
Как лучше всего это сделать? как мы называем эту концепцию? (я предполагаю, что это не двойное выполнение условной последовательности)
В идеале я бы использовал TBB для достижения этой цели, но я не знаю, подходит ли функция TBB для моих нужд. (Я открыт для любых других предложений)
Вот фрагмент «псевдокода», который был бы моей первой идеей [EDIT: но это неправильно, последовательное выполнение не гарантировано, но код может объяснить мою идею]:
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();
}
}