进程互斥锁

进程互斥锁进程间共享数据的保护 需要进程互斥锁 与线程锁不同 进程锁并没有直接的 C 库支持 但是在 Linux 平台 要实现进程之间互斥锁 方法有很多 大家不妨回忆一下你所了解的 下面就是标准 C 库提供的一系列方案 1 实现方案不出意外的话 大家首先想到的应该是信号量 Semaphores 对信号量的操作函数有两套 一套是 Posix 标准 另一套是 SystemV 标准 Posix 信号量 sem t

进程间共享数据的保护,需要进程互斥锁。与线程锁不同,进程锁并没有直接的C库支持,但是在Linux平台,要实现进程之间互斥锁,方法有很多,大家不妨回忆一下你所了解的。下面就是标准C库提供的一系列方案。

1、实现方案

不出意外的话,大家首先想到的应该是信号量(Semaphores)。对信号量的操作函数有两套,一套是Posix标准,另一套是System V标准。

Posix信号量

sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem); int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); int sem_close(sem_t *sem); int sem_destroy(sem_t *sem); int sem_unlink(const char *name);

System V信号量

int semget(key_t key, int nsems, int semflg); int semctl(int semid, int semnum, int cmd, ...); int semop(int semid, struct sembuf *sops, unsigned nsops); int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);

线程锁共享

其实还有另外一个方案:线程锁共享。这是什么呢,我估计了解它的人不多,如果你知道的话,那可以称为Linux开发牛人了。

线程锁就是pthread那一套C函数了:

int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthread_mutex_destroy (pthread_mutex_t *mutex); int pthread_mutex_trylock (pthread_mutex_t *mutex); int pthread_mutex_lock (pthread_mutex_t *mutex); int pthread_mutex_timedlock (pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime); int pthread_mutex_unlock (pthread_mutex_t *mutex);

但是这只能用在一个进程内的多个线程实现互斥,怎么应用到多进程场合呢,被多个进程共享呢?

很简单,首先需要设置互斥锁的进程间共享属性:

int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared); pthread_mutexattr_t mattr; pthread_mutexattr_init(&mattr); pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); 

其次,为了达到多进程共享的需要,互斥锁对象需要创建在共享内存中。

最后,需要注意的是,并不是所有Linux系统都支持这个特性,程序里需要检查是否定义了_POSIX_SHARED_MEMORY_OBJECTS宏,只有定义了,才能用这种方式实现进程间互斥锁。

2、平台兼容性

我们来看看这三套方案的平台移植性。

  • 绝大部分嵌入式Linux系统,glibc或者uclibc,不支持_POSIX_SHARED_MEMORY_OBJECTS;
  • 绝大部分嵌入式Linux系统,不支持Posix标准信号量;
  • 部分平台,不支持System V标准信号量,比如Android。

3、匿名锁与命名锁

当两个(或者多个)进程没有特殊关系(比如父子进程共享)时,我们只能通过约定好的名字来访问同一个锁,这就是命名锁。然而,如果我们有其他途径定位一个锁,那么匿名锁是更好的选择。这三套方案是否都支持匿名锁与命名锁呢?

  • Posix信号量

通过sem_open创建命名锁,通过sem_init创建匿名锁,其实sem_init也支持进程内部锁。

  • System V信号量

semget中的key参数可以看成是名字,所以支持命名锁。该方案不支持匿名锁。

  • 线程锁共享

不支持命名锁,支持匿名锁。

4、缺陷

在匿名锁与命名锁的支持上,一些方案是有不足的,但这还是小问题,更严重的问题是异常状况下的死锁问题。

与多线程环境不一样的是,在多进程环境中,一个进程的异常退出不会影响其他进程,但是如果使用了进程互斥锁呢?假如一个进程获取了互斥锁,但是在访问互斥资源的代码中crash了,或者遇到信号退出了,那么其他等待同一个锁的进程(内部某个线程)就挂死了。在多线程环境中,程序异常整个进程退出,不需要考虑异常时锁的释放,多进程环境则是一个实实在在的问题。

System V信号量通过UNDO方式可以解决该问题。但是如果考虑到平台兼容性等问题,这三个方案仍不能满足需求,我会接着介绍一种更好的方案。那就是:

安全且平台兼容的进程互斥锁_luansxx的专栏-CSDN博客

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228190.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午7:36
下一篇 2026年3月16日 下午7:36


相关推荐

  • JS 数组转字符串的4种方法

    JS 数组转字符串的4种方法前言 在项目过程中 我们会有很多情况会遇到我们拿到的的是一个数组的情况 但是后台可能需要的是一个以 分割的字符串 那我们有哪些方法进行转换呢 1 我们首先 for 循环这个数组 将需要的值加 拼接起一个字符串 这个时候的字符串会以 结尾 我们再用 substring 对这个字符串进行截取去掉最后的那个 得到想要的值 2 toString 方法能够把每个元素转换为字符串 然后以逗号连接输出显示 JavaScript 会以迭代的方式调用 toString 方法把所有数组都转换为字符串

    2026年3月19日
    1
  • 排列问题(递归算法)

    排列问题(递归算法)问题描述 对 n 个元素进行全排列 列出所有情况 例如 1 2 3 三个数字会得到 123 132 213 231 312 321 这 6 中情况思路 设 n 为元素个数 元素集合为 R r1 r2 r3 rn 计算方法为 Perm n 当 n 1 时 则只有一种情况 nbsp r 当 n gt 1 时 则有 r1 Perm R1 r2 Perm R2 r3 Perm R3

    2026年3月18日
    2
  • android模拟器pc版 安装软件,不用花钱,电脑端Android模拟器安装使用教程

    android模拟器pc版 安装软件,不用花钱,电脑端Android模拟器安装使用教程如今说到什么智能手机最火 那很多人肯定会说 android 系统的手机 如果你还没有 Android 手机 又想买一部试试 可是价格都不便宜 买来不适合自己怎么办 那么可以先在电脑上安装一个 Android 模拟器 因为它可以在电脑上模拟出 Android 手机系统 让你提前体验一下它的魅力 教程一共分为两步 一是安装模拟器 二是模拟器中安装软件一 在电脑上安装 Android 模拟器二 在模拟器安装 APK 的方法

    2026年3月26日
    3
  • 求Sn=a+aa+aaa+…+aaa…a的值

    求Sn=a+aa+aaa+…+aaa…a的值

    2021年8月17日
    71
  • RabbitMQ入门:主题路由器(Topic Exchange)[通俗易懂]

    上一篇博文中,我们使用directexchange代替了fanoutexchange,这次我们来看下topicexchange。一、TopicExchange介绍topicexchan

    2022年2月16日
    192
  • php 数组转为字符串 或者字符串转为数组

    php 数组转为字符串 或者字符串转为数组1 数组转为字符串 array php Java web result implode array 2 字符串转为数组 str php java web rsult explode str 更多的功能和插件 nbsp 地址 https www kancloud cn he he thinkphp5

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号