Информация об изменениях

Сообщение Re: эффективная реализация thread pool от 17.05.2018 6:49

Изменено 17.05.2018 6:51 lpd

Re: эффективная реализация thread pool
Здравствуйте, barney, Вы писали:

B>для этого work1 нужно не просто разместить в очереди до work2

B>а и гарантировать что поток, исполняющий work1 закончится до того, как другой поток возьмется за work2
B>Возможно тут нужны некие барьеры

Барьеры тут не очень нужны. Можно построить логику на условной переменной и проверке условий при выборе следующей задачи для исполнения.

B>3) Как вообще делаются барьеры?

B>т.е чтобы был некий dispatch_barrier() который заставит все задиспатченные ранее Work выполниться до него гарантированно,
B>при этом сохранив возможность после него делать новые dispatch() просто добавляя новые Work в очередь

Барьер это отдельный примитив синхронизации, который используется, например, в MPI на кластерах.
Re: эффективная реализация thread pool
Здравствуйте, 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 по значению?
Здесь это заметным образом не повлияет не на что.