目录
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
Linux下线程互斥与信号量实现详解

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

被折叠的 条评论
为什么被折叠?



