Периодически запускать рабочие потоки pthread и ждать завершения.Linux

Ответить Пред. темаСлед. тема
Anonymous
 Периодически запускать рабочие потоки pthread и ждать завершения.

Сообщение Anonymous »


Я хотел бы создать набор из 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; я
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Pthread (или потоки) ждут завершения любого потока
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Являются ли рабочие потоки в ForkJoinPool потоками Daemon?
    Anonymous » » в форуме JAVA
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Python: запускайте рабочие потоки и запускайте свои собственные мультипроцессы.
    Anonymous » » в форуме Python
    0 Ответы
    52 Просмотры
    Последнее сообщение Anonymous
  • Рабочие потоки и пропускная способность Netty
    Anonymous » » в форуме JAVA
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Что такое рабочие потоки и какова их роль в шаблоне реактора?
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Linux»