Pthread Лучший способ разбудить несколько потоков - PullRequest
0 голосов
/ 03 мая 2018

Хотелось бы узнать, как лучше всего разбудить несколько потоков одновременно с помощью цикла Я думал об использовании pthread_cond, но мне не нужен мьютекс, так как я не жду ресурсов

Theres n темы с:

start of thread
loop
action
wait
end of loop

И тогда основной поток заметит их всех, чтобы начать работать. Лучше ли использовать pthread cond с мьютексом для каждого потока или лучше воссоздавать потоки каждый раз, когда задача завершается?

1 Ответ

0 голосов
/ 03 мая 2018

Вы действительно можете использовать условную переменную для этого. Это работает так, что ваше условие находится над некоторой общей переменной, которую устанавливает основной поток, чтобы указать, что рабочие потоки должны продолжаться. Вам требуется мьютекс, потому что у вас do есть общий ресурс - общая переменная, которую устанавливает основной поток и читают рабочие потоки.

Что-то вроде:

/* shared variables */
int run_iteration = -1;
pthread_mutex_t iteration_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t iteration_cond = PTHREAD_COND_INITIALIZER;

Рабочие темы:

int current_iteration = 0;

while (... )
{
    /* Wait for main to signal start of current_iteration */
    pthread_mutex_lock(&iteration_lock);
    while (run_iteration < current_iteration)
        pthread_cond_wait(&iteration_cond, &iteration_lock);
    pthread_mutex_unlock(&iteration_lock);

    /* ... Execute current_iteration ... */

    current_iteration++;
}

Основная нить:

/* signal start of next iteration */
pthread_mutex_lock(&iteration_lock);
run_iteration++;
pthread_cond_broadcast(&iteration_cond);
pthread_mutex_unlock(&iteration_lock);

В качестве альтернативы, если вам нужно, чтобы потоки работали в режиме блокировки, вместо этого можно использовать барьер pthread (pthread_barrier_t).

...