Я не думаю, что это связано с барьером, как вы представили его в псевдокоде.Я предполагаю, что ваш glibc примерно такой же, как моя машина.Я примерно скомпилировал ваш псевдокод, и он работает так, как я ожидаю: потоки выполняют некоторую работу, основной поток выполняет некоторую работу, все они достигают барьера и затем зацикливаются.
Можете ли вы прокомментировать больше о любой другой синхронизацииметоды или каковы рабочие функции?
Это пример программы, которую я использую:
#include <pthread.h>
#include <stdio.h>
#include <time.h>
struct timespec req = {1,0}; //{.tv_sec = 1, .tv_nsec = 0};
struct timespec rem = {0,0}; //{.tv_sec = 0, .tv_nsec = 0};
pthread_barrier_t barrier;
void *thread_func(void *params) {
long int name;
name = (long int)params;
while(1) {
printf("This is thread %ld\n", name);
nanosleep(&req, &rem);
pthread_barrier_wait(&barrier);
printf("More work from %ld\n", name);
}
}
int main(void)
{
pthread_t th1, th2;
pthread_barrier_init(&barrier, NULL , 3);
pthread_create(&th1, NULL, &thread_func, (void*)1);
pthread_create(&th2, NULL, &thread_func, (void*)2);
while(1) {
nanosleep(&req, &rem);
printf("This is the parent\n\n");
pthread_barrier_wait(&barrier);
}
return 0;
}