线程同步互斥之有名信号量,无名信号量

文章详细介绍了Linux系统中处理线程互斥的多种方式,包括有名信号量和无名信号量的使用。有名信号量适用于多进程间的同步互斥,通过`sem_open`、`sem_wait`、`sem_post`等函数进行操作,而无名信号量主要用于线程间的互斥,使用`sem_init`和`sem_destroy`进行初始化和销毁。文章还提供了有名和无名信号量的测试代码示例。

目录

1、线程互斥方式

2、基本概念

3、有名信号量

4、有名信号量的测试代码

5、有名信号量与信号量的比较

6、无名信号量

7、无名信号量测试代码

1、线程互斥方式

1、什么是同步互斥?为什么要处理同步互斥?

同步互斥就是使得线程处理任务时有先后的顺序,为了防止线程资源被抢占的问题。

2、处理同步互斥方式有哪些?

信号量 -> 进程 (共享内存+信号量一起使用) ---进程IPC中的一种

有名信号量 -> 进程 (共享内存+有名信号量一起使用) <编译的时候需要链接线程库-lpthread>

无名信号量 -> 线程

互斥锁 -> 线程

读写锁 -> 线程

条件变量 -> 线程(互斥锁+条件变量一起使用)

2、基本概念

POSIX信号量与IPC信号量组中的信号量元素的逻辑完全一样,但POSIX信号量操作更加简便,接口更加易用。在多进程多线程中运用广泛。

POSIX信号量分成两种:

  • POSIX匿名信号量
    • 通常用在线程间
    • 只存在于内存,在文件系统中不可见
  • POSIX具名信号量
    • 通常用在进程间
    • 存在于文件系统/dev/shm中,可被不同进程操作

3、有名信号量

POSIX 具名信号量主要用在多进程间同步互斥,其 P/V 操作与匿名版本无异,其最大的特点是存在于文件系统 /dev/shm 中,可以被系统中任意有权限的进程打开

有名信号量的函数接口说明如下:

sem_t *sem;
1)创建并打开一个有名信号量  -> sem_open()
#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <semaphore.h>
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);
函数作用:初始化并且打开一个有名信号量
参数:name: 有名信号量的名字,要求必须以"/"开头,例如"/sem_test或/my_sem"    -> 存在于/dev/shm目录下
    oflag:O_CREAT  -> 如果不存在创建
           O_CREAT|O_EXCL  -> 不存在则创建  -> 存在就报错
    mode:八进制权限,例如: 0666
    value:有名信号量的起始值   --->   0
注意:如果oflag中有O_CREAT这个选项,则这个mode与value必须要填。
    如果有名信号量已经存在的了,但是你又写了O_CREAT,那么后面你填的mode和value就会被忽略。
返回值:成功:有名信号量的地址
        失败:SEM_FAILED   -> NULL / (sem_t *)-1
sem_t* sem = sem_open(SEM_NAME,O_CREAT,0777,0);
    if(sem == SEM_FAILED)
    {
        printf("sem_open fail\n");
     return -1;
    } 
 
2)有名信号量的P操作
P操作: 资源数-1操作    -> sem_wait()  -> man 3 s
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值