Периодически запускать рабочие потоки pthread и ждать завершения. ⇐ Linux
Периодически запускать рабочие потоки pthread и ждать завершения.
Я хотел бы создать набор из N потоков под управлением исходного процесса. Я хотел бы управлять ими, как в этом псевдокоде:
create_n_threads(); Пока(1) { основная задача изменяет глобальную переменную «фаза» для управления типом работы. запустить N потоков для пробуждения и выполнения работы на основе глобальной переменной «фаза» подождите, пока все потоки завершат свои задачи основная задача — метарасчет по частичным результатам всех работников } Я пробовал pthread_barrier_wait(). Он хорошо работает для запуска вычислительного цикла, но не дает мне возможности узнать, когда завершена каждая задача. Как мне узнать, что все потоки завершены, чтобы можно было безопасно выполнить метарасчет результата? Я не хочу использовать pthread_join, потому что эти рабочие циклы будут замкнуты в цикле, и мне не нужны накладные расходы на уничтожение и воссоздание задач в каждом цикле.
#include #include #include #include // для сна() #define NTHREADS 4 pthread_barrier_t б; typedef struct threadargs { внутренний идентификатор; // идентификатор потока 0-\>N внутренняя фаза; // либо 0, либо не ноль, чтобы установить черную/красную фазу } ТРИДАРГС; интервал фазы = 0; интервал цикла = 0; // рабочая функция // вызывается с указателем на структуру THREADARGS // который сообщает работнику его идентификатор, начальный и конечный столбцы, чтобы они расслабились, и красную/черную фазу void \*thread_func(void \*x) { интервал времени; // идентификатор потока int *retval = (int *) malloc(sizeof(int)); // поэтому оно сохраняется даже после смерти потока tid = ((THREADARGS *) x)->id; while(1) { // ждем срабатывания printf("%d: %d %d\n", цикл, время, фаза); pthread_barrier_wait(&b); } *retval = 2*tid; pthread_exit((void *)retval); } int main(int argc, char \*argv\[\]) { pthread_t threadids\[NTHREADS\]; // сохраняем идентификаторы потоков ОС THREADARGS thread_args\[NTHREADS\]; // аргументы потока интервал RC, я; // инициализируем многопроцессный барьер pthread_barrier_init(&b, NULL, NTHREADS+1); /* порождаем потоки */ для (я = 0; я
Я хотел бы создать набор из N потоков под управлением исходного процесса. Я хотел бы управлять ими, как в этом псевдокоде:
create_n_threads(); Пока(1) { основная задача изменяет глобальную переменную «фаза» для управления типом работы. запустить N потоков для пробуждения и выполнения работы на основе глобальной переменной «фаза» подождите, пока все потоки завершат свои задачи основная задача — метарасчет по частичным результатам всех работников } Я пробовал pthread_barrier_wait(). Он хорошо работает для запуска вычислительного цикла, но не дает мне возможности узнать, когда завершена каждая задача. Как мне узнать, что все потоки завершены, чтобы можно было безопасно выполнить метарасчет результата? Я не хочу использовать pthread_join, потому что эти рабочие циклы будут замкнуты в цикле, и мне не нужны накладные расходы на уничтожение и воссоздание задач в каждом цикле.
#include #include #include #include // для сна() #define NTHREADS 4 pthread_barrier_t б; typedef struct threadargs { внутренний идентификатор; // идентификатор потока 0-\>N внутренняя фаза; // либо 0, либо не ноль, чтобы установить черную/красную фазу } ТРИДАРГС; интервал фазы = 0; интервал цикла = 0; // рабочая функция // вызывается с указателем на структуру THREADARGS // который сообщает работнику его идентификатор, начальный и конечный столбцы, чтобы они расслабились, и красную/черную фазу void \*thread_func(void \*x) { интервал времени; // идентификатор потока int *retval = (int *) malloc(sizeof(int)); // поэтому оно сохраняется даже после смерти потока tid = ((THREADARGS *) x)->id; while(1) { // ждем срабатывания printf("%d: %d %d\n", цикл, время, фаза); pthread_barrier_wait(&b); } *retval = 2*tid; pthread_exit((void *)retval); } int main(int argc, char \*argv\[\]) { pthread_t threadids\[NTHREADS\]; // сохраняем идентификаторы потоков ОС THREADARGS thread_args\[NTHREADS\]; // аргументы потока интервал RC, я; // инициализируем многопроцессный барьер pthread_barrier_init(&b, NULL, NTHREADS+1); /* порождаем потоки */ для (я = 0; я
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Python: запускайте рабочие потоки и запускайте свои собственные мультипроцессы.
Anonymous » » в форуме Python - 0 Ответы
- 52 Просмотры
-
Последнее сообщение Anonymous
-