使用三个线程下的信号量实现顺序打印ABC

#include #include #include 【使用三个线程下的信号量实现顺序打印ABC】#include #define PTHREAD_NUM 3void * print_a(void *); void * print_b(void *); void * print_c(void *); typedef void *(*pthread_func_t)(void *); typedef struct abc_demo{ sem_t sem_array[PTHREAD_NUM]; char *retval[PTHREAD_NUM]; pthread_t tid_array[PTHREAD_NUM]; pthread_func_t pfunc_array[PTHREAD_NUM]; }abc_demo; abc_demo abc = { .pfunc_array = {print_a, print_b, print_c}, }; static int g_count = 0; void *print_a(void *arg) { while(1){ sem_wait(&(abc.sem_array[0])); printf("A------%d----------\n", g_count++); sem_post(&(abc.sem_array[1])); if(g_count == 5 ) pthread_exit((void*)1); sleep(1); } } void *print_b(void *arg) { while(1){ sem_wait(&(abc.sem_array[1])); printf("B+++++++++++++++++++++++++++++\n"); sem_post(&(abc.sem_array[2])); if(g_count == 5 ) pthread_exit((void*)1); sleep(1); } } void *print_c(void *arg) { while(1){ sem_wait(&(abc.sem_array[2])); printf("C\n"); sem_post(&(abc.sem_array[0])); if(g_count == 5 ) pthread_exit((void*)1); sleep(1); } }int main(int argc, const char *argv[]) { int i,ret; sem_init(&(abc.sem_array[0]),0, 1); sem_init(&(abc.sem_array[1]),0, 0); sem_init(&(abc.sem_array[2]),0, 0); for(i = 0; i < PTHREAD_NUM; i++) { ret = pthread_create(abc.tid_array+i, NULL, abc.pfunc_array[i], NULL); if(ret < 0) { perror("pthread_create"); return -1; } } for(i = 0; i < PTHREAD_NUM; i++) { ret = pthread_join(abc.tid_array[i], (void **)abc.retval+i); if(ret < 0) { perror("pthread_join"); return -1; } } sem_destroy(&(abc.sem_array[0])); sem_destroy(&(abc.sem_array[1])); sem_destroy(&(abc.sem_array[2])); return 0; }

测试结果 使用三个线程下的信号量实现顺序打印ABC
文章图片

    推荐阅读