Я пишу игрушечную программу, чтобы помочь мне понять, как работают барьеры. В программе у меня есть каждый поток, проверяющий, находится ли элемент в одном массиве в другом. Я смог запустить все потоки одновременно, но хотел бы, чтобы все они встретились после фильтрации, чтобы правильно добавить любые числа в массив.
Без этого неправильные числа могут быть добавлены в массив.
РЕДАКТИРОВАТЬ: кто-то предложил мне добавить pthread_barrier_wait (& after_filtering); в вызове filter_threads, и это, похоже, сработало. Теперь я знаю, что мне нужно добавить вызов ожидания как в main, так и в функцию filter, но я не совсем понимаю ход выполнения и как работают wait wait в main. Я знаю, что ожидание в функции потока гарантирует, что все потоки достигнут этой точки перед продолжением, но разве это не произойдет, как только потоки будут созданы? Это означает, что числа должны иметь значения 99 вместо 4, 3, 8, 1?
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_barrier_t before_filtering, after_filtering;
int nums[4] = {99, 99, 99, 99};
int arr[15] = {12, 5, 31, 8, 1, 6, 24, 4, 81, 42};
void filter(int i, int a[]){
// Loop through the list
int j;
for (j = 0; j < 10; j++)
{
if (nums[i] == a[j])
nums[i] = 0;
}
}
void *filter_threads(void *id){
int *myid = (int *)id;
printf("thread %d\n",*myid);
pthread_barrier_wait(&before_filtering);
filter(*myid, arr);
pthread_barrier_wait(&after_filtering);
}
int main(void)
{
pthread_t tids[3];
int index[3];
pthread_barrier_init(&before_filtering, NULL, 4);
pthread_barrier_init(&after_filtering, NULL, 4);
int i, j;
for (i = 0; i < 3; i++)
{
index[i] = i + 1;
pthread_create(&tids[i], NULL, filter_threads, &index[i]);
}
// Cannot call any filter function without first populating nums
nums[0] = 4;
nums[1] = 3;
nums[2] = 8;
nums[3] = 1;
pthread_barrier_wait(&before_filtering);
filter(0, arr);
pthread_barrier_wait(&after_filtering);
// Add new numbers to arr...
printf("New nums: ");
for (i = 0; i < 4; i++)
printf("%d, ", nums[i]);
printf("\n");
for (i = 0; i < 3; i++)
pthread_join(tids[i], NULL);
// Print new arr...
pthread_barrier_destroy(&before_filtering);
pthread_barrier_destroy(&after_filtering);
}
Я попытался добавить еще один вызов ожидания после фильтрации, но теперь программа просто зависает. Как мне это сделать?