Здравствуйте, barney, Вы писали:
B>для этого work1 нужно не просто разместить в очереди до work2 B>а и гарантировать что поток, исполняющий work1 закончится до того, как другой поток возьмется за work2 B>Возможно тут нужны некие барьеры
Барьеры тут не очень нужны. Можно построить логику на условной переменной и проверке условий при выборе следующей задачи для исполнения.
B>3) Как вообще делаются барьеры? B>т.е чтобы был некий dispatch_barrier() который заставит все задиспатченные ранее Work выполниться до него гарантированно, B>при этом сохранив возможность после него делать новые dispatch() просто добавляя новые Work в очередь
Барьер это отдельный примитив синхронизации, который используется, например, в MPI на кластерах.
B>2) Как эффективно передается Work между потоками? B>Я так понимаю, что все thread используют общую память т.е. нет никакой нужды ничего никуда копировать? Или как?
Память потоков общая, хотя может быть еще свой TLS(Thread Local Storage). B>Будет ли эффективной передача std::function по значению?
Здесь это заметным образом не повлияет не на что.
У сложных вещей обычно есть и хорошие, и плохие аспекты.
Берегите Родину, мать вашу. (ДДТ)