概述
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)
最后
以上就是高贵帆布鞋为你收集整理的linux信号量机制(semaphore)的全部内容,希望文章能够帮你解决linux信号量机制(semaphore)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复