linux编程之信号量

摘要:
等待信号量函数void down函数:获取信号量。如果信号量值大于0,则从信号量值中减去1并立即返回;如果信号量的值为0,则进程将休眠,直到释放信号量。

一、概念

linux信号量:

  允许多个线程同时进入临界区,可以用于进程间的同步。

和互斥锁(mutex)的区别:

  互斥锁只允许一个线程进入临界区。

所在头文件:

  semaphore.h

二、主要函数

  • 初始化函数

      int sem_init(sem_t *sem, int pshared, unsigned int value)

      sem:要初始化的信号量

      pshared:此信号量是在进程间共享还是线程间共享

      value:信号量的初始值

  • 删除函数 

      int sem_destroy(sem_t *sem)

      sem:要销毁的信号量

      注意:只有用sem_init初始化的信号量才能用sem_destroy销毁

  • 等待信号量函数

      int sem_wait(sem_t *sem)

      功能:等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回;

         如果信号量的值为0,则线程阻塞。相当于P操作。

         成功返回0,失败返回-1。

  • 释放信号量

      int sem_post(sem_t *sem)

      功能:释放信号量,让信号量的值加1。相当于V操作。

三、内核编程所用的信号量接口函数

      linux内核和应用程序,都会使用信号量,但是它们却用的是不通的函数接口,这里标注一下内核使用的信号量函数接口,一般写驱动的时候会用得到。

  • 初始化函数

      void sema_init(struct semaphore *sem, int val)

         sem:要初始化的信号量

            value:信号量的初始值

                init_MUTEX(sem)

                功能:定义一个互斥锁,其实该宏的功能,是定义一个初始值为1的信号量。

                init_MUTEX_LOCKED(sem)

                功能:定义一个互斥锁,一个初始值为0的信号量。

  • 等待信号量函数    

                void down(struct semaphore *sem)

      功能:获得信号量,如果信号量的值大于0,将信号量的值减1,立即返回;

         如果信号量的值为0,则进程睡眠,直到该信号量被释放,才能重新得到运行。

                int down_interruptible(struct semaphore * sem)

                功能:用来获取信号量,如果信号量大于或等于0,获取信号量;

                        如果信号量不可用,进程将被置为 TASK_INTERRUPTIBLE 类型的睡眠状态,

                        该函数由返回值来区分是正常返回(重新运行),还是被信号中断返回(重新运行)。

                        如果返回0,表示获得信号量正常返回;如果被信号打断,返回 -EINTR.

                        该函数与down()函数的区别在于,down睡眠了之后,只有信号量被释放,才能重新得到运行;

                        而该函数可以因为其他信号来打断这个睡眠,而得到运行,多了一种获得重新运行的途径。

                int down_trylock(struct semaphore * sem)

                功能:用来获取信号量,如果信号量大于或等于0,获取信号量,返回值为0;

                         否则立刻返回,且返回值为1,而不会睡眠。

  • 释放信号量

      void up(struct semaphore *sem)

      功能:释放信号量,让信号量的值加1。

参考资料:Linux线程的信号量同步 

免责声明:文章转载自《linux编程之信号量》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【sql进阶】SQL Server 将某一列的值拼接成字符串Hadoop之Flume详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VC++函数只被调用一次

如何保证某个函数只被调用一次   一个函数caller会在其内部调用另外一个函数callee,现在的情况是,caller可能会在多个地方被多次调用,而你希望callee只在第一次被调用时被调用一次。一般情况下,callee会是一个对环境或者资源的初始化工作。 或许,从代码结构的角度来讲,你第一个想到的是把callee从caller中拿出来,放到某个合适的...

Jmeter(十二)

------------------------------------------------------------------- 转载自:北京-宏哥 https://www.cnblogs.com/du-hong/p/13100499.html -----------------------------------------------------...

AQS与重入锁ReetrantLock原理

一、AQS原理 AQS(AbstractQueuedSynchronizer)队列同步器是用来构建锁、同步组件的基础框架。 AQS内部通过一个volatile int类型的成员变量state控制同步状态【0代表锁未被占用,1表示已占用】,通过内部类Node构成FIFO的同步队列实现等待获取锁的线程排队工作,通过内部类ConditionObject构建条件等...

面试题--赵银科技

1.pubilc A{ public void test(){} }  public B extends A{ protected void test(){} } 这样有问题吗?为什么?  错, 2.public A{ public long test(){} }  public B extends A{ public int test(){} } 这样有...

MySQL-死锁查询

1、查询是否锁表 show OPEN TABLES where In_use > 0; 查询到相对应的进程 === 然后 killid 2、查询进程 show processlist 补充: 查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 查看等待锁的事务 SELECT * FROM I...

浅析vue混入(mixin)

  vue中的混入,可以在一定程度上提高代码的复用性。通俗来说,混入类似于“继承”,当前组件对象继承于组件对象,一般情况下遵循“就近原则”。但是与继承不同的是,继承一般都跟随着属性的重写与合并,混入在不同的配置项中,有着不同的混入策略,下面会一一进行介绍vue不同配置项的混入策略。vue混入的基本流程如图所示,混入属性的合并是发生在组件的生命周期钩子调用之...