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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C代码pthread信号量程序,有3个线程按顺序打印相关的知识,希望对你有一定的参考价值。

我想打印顺序像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("
F1(): %d", 1);
    sem_post(&sem2);         
  }  
}

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

void* f3(void*)
{
  sem_wait(&sem3);
  for(int i=1; i<=MAX_NUM; i++)
  {
    printf("
F3(): %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;

}
答案

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

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

另一答案

使用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("
F1(): %d", 1);
    sem_post(&sem2);
  }
}

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

void *f3(void* p)
{
  for(int i=1; i<=MAX_NUM; i++)
  {
  sem_wait(&sem3);
    printf("
F3(): %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;

}

以上是关于C代码pthread信号量程序,有3个线程按顺序打印的主要内容,如果未能解决你的问题,请参考以下文章

POSIX(Linux多线程)使用信号量三个线程顺序打印十次123

如何为 3 个不同的事件(信号量、pthread 条件和阻塞套接字接收)阻塞单个线程?

C ++中std :: thread优于pthread的优势[重复]

linux下c程序 daemonfork与创建pthread的顺序问题

Linux学习_线程的死锁和信号

Linux系统编程-(pthread)线程通信(信号量)