zoukankan      html  css  js  c++  java
  • Posix信号量操作函数

    Posix信号量:

    分类:

    Posix有名信号量:使用Posix IPC名字标识,可用于线程或进程间同步
    Posix基于内存的信号量:存放在共享内存区中,可用于进程或线程间的同步

    sem_open()、sem_close()、sem_unlink()函数:

    #include <semaphore.h>
    
    // 创建一个新的有名信号量或打开一个已存在的有名信号量
    // 成功返回指向信号量的指针,出错返回SEM_FAILED
    sem_t *sem_open(const char *name, int oflag, /* mode_t mode, unsigned int value */);
    // name:IPC 名字,可能是某个文件系统中的一个真正路径名,也可能不是
    // oflag: 可以是0、O_CREAT、O_CREAT|O_EXCL
    // 在oflag指定了O_CREAT标志后,mode、value参数必须指定(mode指定权限位,value指定信号量初值)
    
    // 关闭一个由 sem_open 打开的信号量
    // 成功返回0,出错返回-1
    int sem_close(sem_t *sem);
    
    // 将某个有名信号量从系统删除
    // 成功返回0,出错返回-1
    int sem_unlink(const char *name);

    sem_wait()、sem_trywait()函数:

    #include <semaphore.h>
    
    // 测试指定信号量的值,若该值大于0,则将其减1并立即返回,若该值为0,则
    // 线程被投入睡眠,等待该值变为大于0,再将其减1并返回 
    // 成功返回0,出错返回-1
    int sem_wait(sem_t *sem);
    
    // 
    // 测试指定信号量的值,若该值大于0,则将其减1并立即返回,若该值为0,则
    // 返回一个EAGAIN错误
    // 成功返回0,出错返回-1
    int sem_trywait(sem_t *sem);

    sem_post()函数:

    #include <semaphore.h>
    
    // 在线程使用完某个信号量时,调用sem_post(),该函数将指定信号量的值加1,
    // 然后唤醒等待该信号量值变为正数的任意线程
    // 成功返回0,出错返回-1
    int sem_post(sem_t *sem);

    sem_getvalue()函数:

    #include <semaphore.h>
    
    // 通过valp返回指定信号量的当前值,若当前信号量已上锁,则返回0或某个
    // 负数(其绝对值为等待该信号量解锁的线程数)
    // 成功返回0,出错返回-1
    int sem_getvalue(sem_t *sem, int *valp);

    sem_init()、sem_destroy函数:

    #include <semaphore.h>
    
    // 初始化一个基于内存的信号量(sem指向的)
    int sem_init(sem_t *sem, int shared, unsigned int value);
    // sem参数指向应用程序分配的sem_t变量
    // shared参数为0时,待初始化的信号量是在同一进程的各个线程中共享的(具有随进程的持续性)
    // shared参数非0时,待初始化的信号量必须放在某种类型的共享内存区中,想
    // 要是由此信号量的所有进程都需要可以访问该共享内存区(随该共享内存区持续)
    // value参数为该信号量的初始值
    
    // 摧毁指定的基于内存的信号量
    // 成功返回0,出错返回-1
    int sem_destroy(sem_t *sem);
  • 相关阅读:
    Java的自动拆箱和装箱
    记录一次买阿里云服务器、建站的经验
    java中的位运算符
    java String拼接时候的一个小问题
    java获取各类容器和数组的长度
    java多线程:循环屏障
    Spring框架10:spring编程式事务控制
    Spring框架9:spring实现声明式事务控制
    Spring框架8:spring使用AOP实现事务控制
    C++ 中的bind
  • 原文地址:https://www.cnblogs.com/lnlin/p/9721375.html
Copyright © 2011-2022 走看看