#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;
}
测试结果
文章图片
推荐阅读
- android|IPC方式(ContentProvider、Socket、Binder连接池)--《Android开发艺术探索》阅读笔记——第二章part4
- 使用线程的互斥锁实现生产者消费者模型
- 互斥锁与条件变量实现按照顺序打印ABC
- 使用互斥锁实现字符串的逆置