- #include <stdio.h>
- #include <pthread.h>
- #include <errno.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <string.h>
- pthread_cond_t cond1;
- pthread_cond_t cond2;
- pthread_cond_t cond3;
- pthread_mutex_t mutex;
- int flag=0; //0:A //1:B // 2:C
- void * A(void * arg)
- {
- int i=0;
- while(i<10)
- {
- pthread_mutex_lock(&mutex);
- if(flag!=0)
- {
- //其他线程运行时阻塞
- pthread_cond_wait(&cond1,&mutex);//当前线程睡在cond1上;
- //解开互斥锁,当前线程进入休眠状态等待别唤醒,时间片切换到另一个
- }
- printf("A");
- fflush(stdout);
- i++;
- sleep(1);
- flag=1;
- pthread_cond_signal(&cond2);
- //唤醒cond2下的线程
- pthread_mutex_unlock(&mutex);
- //解开互斥锁
- }
- pthread_exit(NULL);
- }
- void * B(void * arg)
- {
- int i=0;
- while(i<10)
- {
- pthread_mutex_lock(&mutex);
- if(flag!=1)
- {
- //其他线程运行时阻塞
- pthread_cond_wait(&cond2,&mutex);
- //解开互斥锁,当前线程进入休眠状态等待别唤醒,时间片切换到另一个
- }
- printf("B");
- fflush(stdout);
- i++;
- sleep(1);
- flag=2;
- pthread_cond_signal(&cond3);
- //唤醒cond3下的线程
- pthread_mutex_unlock(&mutex);
- //解开互斥锁
- }
- pthread_exit(NULL);
- }
- void * C(void * arg)
- {
- int i=0;
- while(i<10)
- {
- pthread_mutex_lock(&mutex);
- if(flag!=2)
- {
- //其他线程运行时阻塞
- pthread_cond_wait(&cond3,&mutex);
- //解开互斥锁,当前线程进入休眠状态等待别唤醒,时间片切换到另一个
- }
- printf("C");
- fflush(stdout);
- i++;
- sleep(1);
- flag=0;
- pthread_cond_signal(&cond1);
- //唤醒cond1下的线程
- pthread_mutex_unlock(&mutex);
- //解开互斥锁
- }
- pthread_exit(NULL);
- }
-
-
- int main(int argc, const char *argv[])
- {
- //申请互斥锁
- if(pthread_mutex_init(&mutex,NULL)!=0)
- {
- printf("申请失败");
- return -1;
- }
- pthread_t tid1;
- if(pthread_create(&tid1,NULL,A,NULL)!=0)
- {
- perror("pthread_create");
- return -1;
- }
- pthread_t tid2;
- if(pthread_create(&tid2,NULL,B,NULL)!=0)
- {
- perror("pthread_create");
- return -1;
- }
- pthread_t tid3;
- if(pthread_create(&tid3,NULL,C,NULL)!=0)
- {
- perror("pthread_create");
- return -1;
- }
- //初始化条件变量
- pthread_cond_init(&cond1,NULL);
- pthread_cond_init(&cond2,NULL);
- pthread_cond_init(&cond3,NULL);
- pthread_join(tid1,NULL);
- pthread_join(tid2,NULL);
- pthread_join(tid3,NULL);
- return 0;
- }