Linux 信号量和多线程例题

例题:创建三个线程,使之顺序输出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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值