0

我有一个障碍问题任务,其中 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);
}
4

0 回答 0