#include <pthread.h> #include <fcntl.h> #include <semaphore.h> sem_t sem[4]; void *handle(void *arg); int main() { pthread_t tid[4]; int i; for(i=0;i<4;i++) { if(i==0) sem_init(&sem[i],0,1); //0号线程信号量初始值为1,保证开始时0号线程先打印; else sem_init(&sem[i],0,1); //1.2.3号线程信号量初始值为0; pthread_create(&tid[i],NULL,handle,&i); } for(i=0;i<4;i++) { pthread_join(tid[i],NULL); sem_destory(&sem[i]); } return 0; } void *handle(void *arg) { char a='a'; int k=*((int *)arg); while(1) { sem_wait(&sem[k]); //本线程信号量将减至0; printf("%c",a+k); sem_post(&sem[(k+1)%4]);//将下一个线程的信号量加至1,保证按顺序打印; } } 以上是完整代码,一个小问题,假如把handle函数改为如下所示,就会出错,why? void *handle(void *arg) { while(1) { char a='a'; int k=*((int *)arg); sem_wait(&sem[k]); //本线程信号量将减至0; printf("%c",a+k); sem_post(&sem[(k+1)%4]);//将下一个线程的信号量加至1,保证按顺序打印; } }