• linux编程之信号量


    一、概念

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

  • 相关阅读:
    第三十三天 客户机和tcp多个客户端通信
    第三十二天黏包问题及解决方法:
    第三十一天 udp通信和黏包
    第三十天网路的基础
    第二十九天日志和config模块:
    Linux系统开机显示BusyBox v1.22.1 built-in shell(ash) 解决方法
    MTK迁移Oracle单库
    Ubuntu14.04安装mysql
    Ubuntu14.04下tomcat的安装
    Thinking in Java Chapter4 Exercise10 吸血鬼数字
  • 原文地址:https://www.cnblogs.com/amanlikethis/p/6909579.html
Copyright © 2020-2023  润新知