进程间共享mutex

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <pthread.h>
#include <unistd.h>

#define SHARED_MEM_NAME "/my_shared_mem"
#define SHARED_MEM_SIZE sizeof(pthread_mutex_t)

int main() {
    int fd;
    pthread_mutex_t *mutex;
    pthread_mutexattr_t attr;

    // 创建共享内存对象
    fd = shm_open(SHARED_MEM_NAME, O_CREAT | O_RDWR, 0666);
    if (fd == -1) {
        perror("shm_open");
        exit(EXIT_FAILURE);
    }

    // 调整共享内存大小
    if (ftruncate(fd, SHARED_MEM_SIZE) == -1) {
        perror("ftruncate");
        exit(EXIT_FAILURE);
    }

    // 映射共享内存到地址空间
    mutex = mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (mutex == MAP_FAILED) {
        perror("mmap");
        exit(EXIT_FAILURE);
    }

    // 初始化互斥锁属性
    if (pthread_mutexattr_init(&attr) != 0) {
        perror("pthread_mutexattr_init");
        exit(EXIT_FAILURE);
    }
    if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED) != 0) {
        perror("pthread_mutexattr_setpshared");
        exit(EXIT_FAILURE);
    }

    // 初始化互斥锁
    if (pthread_mutex_init(mutex, &attr) != 0) {
        perror("pthread_mutex_init");
        exit(EXIT_FAILURE);
    }

    // 清理互斥锁属性
    pthread_mutexattr_destroy(&attr);

    printf("Mutex initialized\n");

    // 等待一段时间以保持进程运行,让另一个进程可以连接到共享内存
    sleep(30);

    // 销毁互斥锁
    if (pthread_mutex_destroy(mutex) != 0) {
        perror("pthread_mutex_destroy");
        exit(EXIT_FAILURE);
    }

    // 取消映射
    if (munmap(mutex, SHARED_MEM_SIZE) == -1) {
        perror("munmap");
        exit(EXIT_FAILURE);
    }

    // 删除共享内存对象
    if (shm_unlink(SHARED_MEM_NAME) == -1) {
        perror("shm_unlink");
        exit(EXIT_FAILURE);
    }

    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <pthread.h>
#include <unistd.h>

#define SHARED_MEM_NAME "/my_shared_mem"
#define SHARED_MEM_SIZE sizeof(pthread_mutex_t)

int main() {
    int fd;
    pthread_mutex_t *mutex;

    // 打开共享内存对象
    fd = shm_open(SHARED_MEM_NAME, O_RDWR, 0666);
    if (fd == -1) {
        perror("shm_open");
        exit(EXIT_FAILURE);
    }

    // 映射共享内存到地址空间
    mutex = mmap(NULL, SHARED_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (mutex == MAP_FAILED) {
        perror("mmap");
        exit(EXIT_FAILURE);
    }

    // 使用互斥锁
    if (pthread_mutex_lock(mutex) != 0) {
        perror("pthread_mutex_lock");
        exit(EXIT_FAILURE);
    }

    printf("Mutex locked\n");

    // 模拟一些工作
    sleep(5);

    if (pthread_mutex_unlock(mutex) != 0) {
        perror("pthread_mutex_unlock");
        exit(EXIT_FAILURE);
    }

    printf("Mutex unlocked\n");

    // 取消映射
    if (munmap(mutex, SHARED_MEM_SIZE) == -1) {
        perror("munmap");
        exit(EXIT_FAILURE);
    }

    close(fd);

    return 0;
}

总结

  • pthread_mutexattr_t 属性对象仅用于初始化互斥锁,其生命周期在 pthread_mutex_init 完成后就结束了。
  • 可以在初始化互斥锁之后立即销毁属性对象,而不影响互斥锁的使用。
  • 共享内存用于存储互斥锁实例,以便在多个进程之间共享该互斥锁。

一旦互斥锁 pthread_mutex_t 被初始化完毕,就可以立即销毁用于初始化的互斥锁属性 pthread_mutexattr_t。这些属性仅在初始化过程中使用,初始化完成后,它们不会再被使用。因此,可以安全地销毁它们。

详细解释

  • pthread_mutexattr_t 属性对象是用来配置互斥锁的一些属性(例如是否可以在进程间共享)。
  • 这些属性仅在调用 pthread_mutex_init 时使用,之后它们不再需要保留。
  • 互斥锁一旦被初始化,其属性已经应用,并且属性对象就可以销毁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值