linux下信号量和互斥锁的区别

linux下信号量和互斥锁的区别,第1张

信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在哪里)。

而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁, *** 作完了,在解锁。

有的时候锁和信号量会同时使用的。我记得以前做的一个项目就是既有semtake,又有lock。

和用于分配、释放共享内存的 shmget 和 shmctl 类似,系统调用 semget 和 semctl 负责分配、释放信号量。调用 semget 函数并传递如下参数:一个用于标识信号量组的键值,该组中包含的信号量数量和与 shmget 所需的相同的权限位标识。该函数返回的是信号量组的标识符。您可以通过指定正确的键值来获取一个已经存在的信号量的标识符;这种情况下,传递的信号量组的容量可以为0。

信号量会一直保存在系统中,甚至所有使用它们的进程都退出后也不会自动被销毁。最后一个使用信号量的进程必须明确地删除所使用的信号量组,来确保系统中不会有太多闲置的信号量组,从而导致无法创建新的信号量组。可以通过调用semctl来删除信号量组。调用时的四个参数分别为信号量组的标识符, *** 作的信号量在组中的编号、常量IPC_RMID 和一个 union semun 类型的任意值(被忽略)。调用进程的有效用户 id 必须与分配这个信号量组的用户 id 相同(或者调用进程为 root 权限亦可)。与共享内存不同,删除一个信号量组会导致 Linux 立即释放资源。

代码 5.2 展示了用于分配和释放一个二元信号量的函数。

代码 5.2 (sem_all_deall.c)分配和释放二元信号量

#include <sys/ipc.h>

#include <sys/sem.h>

#include <sys/types.h>/* 我们必须自己定义 semun 联合类型。 */

union semun { int valstruct semid_ds *bufunsigned short int *arraystruct seminfo *__buf}

/* 获取一个二元信号量的标识符。如果需要则创建这个信号量 */

int binary_semaphore_allocation (key_t key, int sem_flags)

{

return semget (key, 1, sem_flags)

} /* 释放二元信号量。所有用户必须已经结束使用这个信号量。如果失败,返回 -1 */

int binary_semaphore_deallocate (int semid)

{

union semun ignored_argumentreturn semctl (semid, 1, IPC_RMID, ignored_argument)

}

信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的,因为线程linux还没有实现进程间的通信,所以在sem_init的第二个参数要为0,而且在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids 存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,

消息队列,信号量,内存共享,这几个都是一样的原理。,只不过信号量分为有名与无名

无名使用 <semaphore.h>,

有名信号量<sys/sem.h>

无名信号量不能用进程间通信,

//无名与有名的区别,有名需要KEY值与IPC标识

所以sem_init的第二个参数必须为0,,,,


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/6052046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存