我是靠谱客的博主 高贵帆布鞋,最近开发中收集的这篇文章主要介绍linux信号量机制(semaphore),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部