我正在编写一个玩具程序来帮助我理解障碍是如何工作的。在程序中,我让每个线程检查一个数组中的元素是否在另一个数组中。我能够让所有线程同时开始搜索,但我想让它们在过滤后全部相遇,以便正确地将任何数字添加到数组中。
如果不这样做,错误的数字可能会添加到数组中。
编辑:有人建议我添加 pthread_barrier_wait(&after_filtering); 在对 filter_threads 的调用中,这似乎起到了作用。现在我知道我必须在 main 和 filter 函数中添加一个等待调用,但我不太了解执行流程以及 main 中的等待调用如何工作。我知道线程函数中的等待可确保所有线程在继续之前到达该点,但不是在线程创建后立即发生吗?这意味着 nums 的值应该是 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);
}
我尝试在过滤后添加另一个等待调用,但现在程序只是挂起。我怎样才能做到这一点?