linux信号量机制(semaphore)

本文深入探讨了Linux信号量机制的原理与应用,包括信号量的定义、数据类型、初始化、操作函数及其在进程间互斥资源管理中的作用。

linux信号量机制(semaphore)

信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数sem_trywait()和函数pthread_mutex_trylock()起同样的作用,它是函数sem_wait()的非阻塞版本。它们都在头文件/usr/include/semaphore.h中定义。

信号量的数据类型为结构sem_t,它本质上是一个长整型的数。

函数sem_init()用来初始化一个信号量。它的原型为:

extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));  

sem为指向信号量结构的一个指针;
pshared不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享;
value给出了信号量的初始值。

函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。 
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。 
函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。 
函数sem_destroy(sem_t *sem)用来释放信号量sem。

ps:进程1,进程2之间可以互斥资源,相互等待

//进程1
char SEM_NAME1[] = "vik1";
sem_t *sem1;
sem1 = sem_open(SEM_NAME1,O_CREAT,777,0);
//代码函数执行完成
……
sem_post(sem1);

sem_close(sem3);
sem_unlink(SEM_NAME3)

//进程2
char SEM_NAME1[] = "vik1";
sem_t *sem1;
sem1 = sem_open(SEM_NAME1,O_CREAT,777,0);
sem_wait(sem1);
//代码函数等待信号后执行
……
sem_close(sem3);
sem_unlink(SEM_NAME3)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值