例题:创建三个线程,使之顺序输出abcabc…
分析:如果三个线程不加以控制,会杂乱无章的输出,这时就需要用到信号量,控制他们按顺序输出abc。
首先创建三个线程,分别为线程1,线程2,线程3,线程1输出a,线程2输出b,线程3输出c,同步使之按线程1,线程2,线程3的顺序执行。
对于这些库函数的帮助手册不好理解,将我对于这些函数的理解总结一下:
信号量:
sem_t sem_a; //作用类似 int a;
sem_t sem_b;
sem_t sem_c;
sem_init(a,b,c); //初始化信号量
a:sem_t* 类型,该函数对其初始化
b:指明线程间共享(0),进程间共享(非0)
c:信号量的初始值
sem_wait(a); p操作,给信号量-1
sem_post(a); v操作,给信号量+1
a:信号量标识符
sem_destroy(a); 作用:销毁信号量
a:信号量标识符,sem_t*类型
线程:(有多线程的程序,在编译时,要加上-lpthread参数才能通过编译)
pthread_create(a,b,c,d);
a:pthread_t* 类型,线程标识符
b:线程属性,NULL表示默认属性
c:执行该线程时,跳转到该函数开始运行
d:c函数的参数,指针类型
pthread_join(a,b); 作用:等待子线程结束后主线程再运行
a:线程标识符,pthread_t*类型
b:void**类型,一般为NULL,保存该线程的返回值
下面为该题的代码
sem_t sem_a,sem_b,sem_c;
void* pthread_a(void* arg)
{
while(1)
{
sme_wait(&sem_a);
printf("a");
sem_post(&sem_b);
}
return NULL
}
void* pthread_b(void* arg)
{
while(1)
{
sem_wait(&sem_b);
printf("b");
sem_post(&sem_c);
}
}
void*pthread_c(void* arg)
{
while(1)
{
sem_wait(&sem_c);
pritnf("c\n");
sem_post(&sem_a);
}
return NULL;
}
int main()
{
sem_init(&sem_a,0,1);
sem_init(&sem_b,0,0);
sem_init(&sem_c,0,0);
pthread_t id[3];
pthread_create(&id[0],NULL,pthread_a,NULL);
pthread_create(&id[1],NULL,pthread_b,NULL);
pthread_create(&id[2],NULL,pthread_c,NULL);
pthread_join(id[0],NULL);
pthread_join(id[1],NULL);
pthread_join(id[2],NULL);
sem_destroy(&sem_a);
sem_destroy(&sem_b);
sem_destroy(&sem_c);
return 0;
}