C代码pthread信号量程序,有3个线程按顺序打印

问题描述 投票:-3回答:2

我想打印顺序像1,2,3,1,2,3 ......但下面的代码不按此顺序打印。我无法理解我在使用信号量时犯了错误。请帮助我理解我在这段代码中犯的错误,以便我能解决它。

#include <pthread.h> 
#include <stdio.h> 
#include <semaphore.h> 
#include <unistd.h>

#define MAX_NUM 50
sem_t sem1, sem2, sem3;

void *f1(void*)
{
  sem_wait(&sem1);  
  for(int i=1; i<=MAX_NUM; i++)
  {
    printf("\nF1(): %d", 1);
    sem_post(&sem2);         
  }  
}

void* f2(void*)
{
  sem_wait(&sem2);  
  for(int i=1; i<=MAX_NUM; i++)
  {
     printf("\nF2(): %d", 2);
     sem_post(&sem3);
  }
}

void* f3(void*)
{
  sem_wait(&sem3);
  for(int i=1; i<=MAX_NUM; i++)
  {
    printf("\nF3(): %d", 3);    
    sem_post(&sem1);   
 }
}

int main()
{
   pthread_t p1, p2, p3;
   sem_init(&sem1, 0, 1);
   sem_init(&sem2, 0, 1);
   sem_init(&sem3, 0, 1); 

  pthread_create(&p1, NULL, f1,  (void*)NULL);
  pthread_create(&p2, NULL, f2,  (void*)NULL);
  pthread_create(&p3, NULL, f3,  (void*)NULL);  

  pthread_join(p1, NULL);
  pthread_join(p2, NULL);
  pthread_join(p3, NULL);

  return 0;

}
c multithreading pthreads semaphore
2个回答
2
投票

你需要以不同于其他的方式初始化sem1,以便F1首先超过其最初的sem_wait

另请注意,一旦每个函数进入其循环,它再也不会调用sem_wait,这意味着您无法再控制打印顺序。


0
投票

使用0初始化sem 2和sem 3并在所有函数中将sem_wait(...)调用内部循环。我希望下面的代码给出预期结果123123 ...

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>


#define MAX_NUM 50
sem_t sem1, sem2, sem3;

void *f1(void* p)
{
  for(int i=1; i<=MAX_NUM; i++)
  {
  sem_wait(&sem1);
    printf("\nF1(): %d", 1);
    sem_post(&sem2);
  }
}

void *f2(void* p)
{
  for(int i=1; i<=MAX_NUM; i++)
  {
  sem_wait(&sem2);
     printf("\nF2(): %d", 2);
     sem_post(&sem3);
  }
}

void *f3(void* p)
{
  for(int i=1; i<=MAX_NUM; i++)
  {
  sem_wait(&sem3);
    printf("\nF3(): %d", 3);
    sem_post(&sem1);
 }
}


int main()
{
   pthread_t p1, p2, p3;
   sem_init(&sem1, 0, 1);
   sem_init(&sem2, 0, 0);
   sem_init(&sem3, 0, 0);

  pthread_create(&p1, NULL, f1,  (void*)NULL);
  pthread_create(&p2, NULL, f2,  (void*)NULL);
  pthread_create(&p3, NULL, f3,  (void*)NULL);
  pthread_join(p1, NULL);
  pthread_join(p2, NULL);
  pthread_join(p3, NULL);

  return 0;

}
© www.soinside.com 2019 - 2024. All rights reserved.