我有一个障碍问题任务,其中 N 个线程必须递增一个数字 X。当所有都完成递增时,最后一个线程将打印一条消息。我知道需要使用信号量将它们同步到最后一个线程,但为什么我们需要将它们相互同步?它们都执行相同的功能,顺序无关紧要。
这是问题中让我感到困惑的部分:
利用信号量来同步对 x 的访问。还使用信号量来防止特殊线程在 n 个线程完成之前打印所需的语句。x 的值将按顺序打印。不要在主函数中使用信号量;在创建的线程中使用它们。
这是我写的代码:
sem_t mutex, barrier;
int x=0, count=0, n=0;
void* PrintMessage(void* a)
{
sem_wait(&barrier);
printf("All threads have finished their execution \n");
sem_post(&barrier);
pthread_exit(0);
}
void* Increment(void* a)
{
sem_wait(&mutex);
x=x+1;
printf("%d \n", x);
count=count+1;
sem_post(&mutex);
if(count==n)
sem_post(&barrier);
pthread_exit(0);
}
int main(int argc, char* argv[])
{
sem_init(&mutex, 0, 1);
sem_init(&barrier, 0, 0);
n=atoi(argv[1]);
pthread_t finalthread;
pthread_create(&finalthread, NULL, PrintMessage, NULL);
pthread_t threads[n];
for(int i=0; i<n; ++i)
{
pthread_create(&threads[i], NULL, Increment, NULL);
pthread_join(threads[i], NULL);
}
pthread_join(finalthread, NULL);
sem_destroy(&mutex);
sem_destroy(&barrier);
}