Вы гарантируете, что потоки заканчиваются в одно и то же время самой природой логики программы.Если ваш алгоритм требует, чтобы потоки выходили в разное время, то барьеры не являются подходящим механизмом управления параллелизмом для этого конкретного алгоритма.
РЕДАКТИРОВАТЬ:
Вы можете атомарно увеличивать"Законченный_чет" и цикл, не выполняющий никакой работы, кроме участвующего в барьере, в то время как это число меньше, чем счетчик барьеров (защита чтения / записи в законченный_чет с соответствующими мьютексами).
РЕДАКТИРОВАТЬ: Я не уверен, хорошо ли я понимаю ваше добавленное описание, я просто написал это на основе вашего исходного кода, возможно, оно будет работать для вас:
int finished_count;
void * thread_start(void *arg) {
int finished = 0;
while (1) {
if (finished) {
pthread_mutex_lock (&finished_lock);
if (finished_count == 8) {
pthread_mutex_unlock (&finished_lock);
break;
}
pthread_mutex_unlock (&finished_lock);
} else {
/* for each column. Only run columns the thread_num
is assigned to */
column_count = thread_num;
for (; column_count < dim - 1; column_count+=threads) {
/* do thread work for data chunk */
}
/* set "finished" as appropriate */
/* Check if we have just finished. */
if (finished) {
pthread_mutex_lock (&finished_lock);
++finished_count;
pthread_mutex_unlock (&finished_lock);
}
}
barrier_result = pthread_barrier_wait(barrier);
}
return 0;
}
РЕДАКТИРОВАТЬ:
Чтобы пояснить мой комментарий выше о копировании или повторной инициализации, POSIX говорит:
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_barrier_init.html
Результаты не определены, если pthread_barrier_init () вызывается с указаниемуже инициализированный барьер.
и
Только объект, на который ссылается барьер, может использоваться для выполнения синхронизации.Результат обращения к копиям этого объекта в вызовах pthread_barrier_destroy () или pthread_barrier_wait () не определен.