TaskQueue: двойное выполнение условной последовательности (C ++)

Я пишу серверное приложение, ориентированное на задачу. Каждый сеанс (клиент) отправляет пакеты на сервер, сервер ставит их в очередь как Задачи, а рабочие (потоки) обрабатывают их. Ограничения:

  • Задачи из одного и того же сеанса должны быть всегда последовательно выполняться (=> если поток начинает обрабатывать задачу сеанса, другой поток не может обрабатывать задачу для того же сеанса, пока первый не завершен)
  • Задачи некоторых типов должны выполняться последовательно
  • Задачи другого типа не обязательно должны выполняться последовательно

Как лучше всего это сделать? как мы называем эту концепцию? (я предполагаю, что это не двойное выполнение условной последовательности)

В идеале я бы использовал 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();
    }
}

person Malandrain    schedule 23.07.2013    source источник


Ответы (1)


Определите задачу TaskCollection, которая может содержать и выполнять другие задачи. Если есть последовательные задачи, поместите их в TaskCollection и отправьте в пул потоков.

person Martin James    schedule 23.07.2013
comment
Проблема заключается в двойной последовательности: одна и та же задача выполняется его «производителем» последовательно и может быть по типу. (обратите внимание, что мой псевдокод в настоящее время неверен) - person Malandrain; 23.07.2013