編寫一個程式,開啟3個執行緒,這3個執行緒的ID分別為A、B、C,每個執行緒將自己的ID在螢幕上列印10遍,要求輸出結果必須按ABC的順序顯示;如:ABCABC….依次遞推。
阿新 • • 發佈:2019-01-03
#include <stdio.h> #include <pthread.h> #include <stdlib.h> #define NUM 10 pthread_mutex_t mutex; pthread_cond_t conda; pthread_cond_t condb; pthread_cond_t condc; int floga = 0; int flogb = 0; int flogc = 0; void *thread_a(void *argv) { int i = 0; char *p; p = (char *)argv; //printf("%s",p); while(i < NUM) { pthread_mutex_lock(&mutex); floga = 1; pthread_cond_wait(&conda,&mutex); floga = 0; //pthread_mutex_unlock(&mutex); printf("%s",p); while(!flogb) { pthread_mutex_unlock(&mutex); sleep(10); pthread_mutex_lock(&mutex); } pthread_cond_signal(&condb); pthread_mutex_unlock(&mutex); i++; } floga = 1; } void *thread_b(void *argv) { int i; char *p; p = (char *)argv; //printf("%s",p); while(i < NUM) { pthread_mutex_lock(&mutex); flogb = 1; pthread_cond_wait(&condb,&mutex); flogb = 0; //pthread_mutex_unlock(&mutex); printf("%s",p); while(!flogc) { pthread_mutex_unlock(&mutex); sleep(10); pthread_mutex_lock(&mutex); } pthread_cond_signal(&condc); pthread_mutex_unlock(&mutex); i++; } } void *thread_c(void *argv) { int i; char *p; p = (char *)argv; //printf("%s",p); while(i < NUM) { pthread_mutex_lock(&mutex); flogc = 1; pthread_cond_wait(&condc,&mutex); flogc = 0; //pthread_mutex_unlock(&mutex); printf("%s",p); while(!floga) { pthread_mutex_unlock(&mutex); sleep(10); pthread_mutex_lock(&mutex); } pthread_cond_signal(&conda); pthread_mutex_unlock(&mutex); i++; } } int main() { pthread_t A; pthread_t B; pthread_t C; int ret; char *pa = "A"; char *pb = "B"; char *pc = "C"; pthread_mutex_init(&mutex,NULL); pthread_cond_init(&conda,NULL); pthread_cond_init(&condb,NULL); pthread_cond_init(&condc,NULL); ret = pthread_create(&A,NULL,thread_a,(void *)pa); if(ret == -1) { printf("pthread_create a error!\n"); exit(-1); } ret = pthread_create(&B,NULL,thread_b,(void *)pb); if(ret == -1) { printf("pthread_create a error!\n"); exit(-1); } ret = pthread_create(&C,NULL,thread_c,(void *)pc); if(ret == -1) { printf("pthread_create a error!\n"); exit(-1); } sleep(2); pthread_cond_signal(&conda); pthread_join(A,NULL); //printf("\nfinished A!\n"); pthread_join(B,NULL); //printf("\nfinished B!\n"); pthread_join(C,NULL); //printf("\nfinished C!\n"); printf("\nfinished!\n"); return 0; }