linux编程之信号量

时间:2021-12-04 04:40:48

一、概念

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线程的信号量同步