多进程之间共享内存通信之pthread_mutex_t

本文介绍了一种使用共享内存实现多进程通信的方法。通过创建共享内存结构体并设置进程间属性,实现了向多个客户端并发发送视频数据的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在做项目的过程中发现一种简便的多进程通信的方法,现将它记录下来。该项目采用多进程的方式向多个客户端同时发视频数据。

    1、创建共享内存结构体

    struct shm_mutex {
int pic_size;
char pic_buf[PIC_COUNT];
pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;

    };

     struct shm_mutex   *pic_mutex;

    2、申请共享内存空间

        int fd = open("test",O_CREAT|O_RDWR,0777);
ftruncate(fd,sizeof(*pic_mutex));   //改变文件大小
pic_mutex = mmap(NULL,sizeof(struct shm_mutex),
PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);  //用户地址映射到内核空间
close(fd);

memset(pic_mutex,0,sizeof(*pic_mutex));

    3、设置共享内存进程间属性

    pthread_mutexattr_init(&pic_mutex->mutexattr);

    pthread_mutexattr_setpshared(&pic_mutex->mutexattr,PTHREAD_PROCESS_SHARED);//此句将线程锁改变为进程间共用属性

    pthread_mutex_init(&pic_mutex->mutex,&pic_mutex->mutexattr);

    在此线程锁的进程间共用属性设置完毕,即可对其进行上锁解锁操作。

   4、操作共享内存

    pthread_mutex_lock(&pic_mutex->mutex);  //上锁
    bzero(pic_mutex->pic_buf, PIC_COUNT);   
    pic_mutex->pic_size = get_picture(pic_mutex->pic_buf);   //获取图片

    pthread_mutex_unlock(&pic_mutex->mutex); //解锁


   pthread_mutex_lock(&pic_mutex->mutex);
   ret_send = sendto(udp_connfd, pic_mutex->pic_buf, pic_mutex->pic_size, 0,
(struct sockaddr *)&client_addr, len);    //发送图片 至客户端
   pthread_mutex_unlock(&pic_mutex->mutex);


<think>嗯,用户问的是pthread_mutex_t pcie_write_mutex = PTHREAD_MUTEX_INITIALIZER;这句话的意思。首先,我需要回忆一下pthread库中的互斥锁相关知识。记得在C语言中,POSIX线程库(pthread)用于多线程编程,互斥锁(mutex)是同步机制的一部分,用来防止多个线程同时访问共享资源导致的竞态条件。 首先分解这句代码的结构。pthread_mutex_t是互斥锁的数据类型,pcie_write_mutex是变量名,然后被初始化为PTHREAD_MUTEX_INITIALIZER。这个宏应该用于静态初始化互斥锁,对吧?通常在静态分配的互斥锁中,不需要显式调用pthread_mutex_init函数,直接使用这个宏来初始化。那动态分配的互斥锁可能需要用init函数来初始化,比如用malloc分配的时候。 不过用户可能想知道每个部分的作用。比如,变量名pcie_write_mutex可能暗示这个锁用于控制对PCIe写入操作的访问,防止多个线程同时写入造成问题。需要解释这个锁的作用场景,比如在多线程环境下保护共享资源,确保每次只有一个线程执行写操作。 还要注意,PTHREAD_MUTEX_INITIALIZER是一个适用于默认属性的静态初始化器。如果互斥锁需要非默认属性,比如进程间共享,可能需要用动态初始化方法。但这里使用的是静态初始化,所以属性是默认的,也就是快速互斥锁,可能不支持递归锁定等特性。 另外,用户可能对多线程编程中的互斥锁概念不太熟悉,所以需要用简单的中文解释清楚。比如,互斥锁就像厕所的门锁,一次只能一个人进去,其他人要等。这样类比可能帮助理解。 还要注意代码的应用场景,比如在驱动程序开发或者高性能计算中,PCIe设备操作可能需要线程安全。使用互斥锁确保写操作不会冲突,避免数据损坏或硬件错误。 可能用户是在看某段代码时遇到这句,想了解它的作用,或者自己在写多线程程序时需要类似的机制。需要确保解释清楚每个部分,并说明使用时的注意事项,比如正确加锁和解锁,避免死锁。 总结来说,回答的结构应该是:首先分解代码的各个部分,解释每个术语,然后说明整体作用,再举例应用场景,最后可能提到注意事项。这样用户能逐步理解,并知道如何正确使用这个初始化方式。</think>这是一个使用POSIX线程库(pthread)进行多线程同步的典型操作,让我们逐步拆解分析: 1. **变量类型** `pthread_mutex_t` - 这是POSIX线程库定义的互斥锁(mutex)数据类型 - 相当于一把"线程锁",用于保护共享资源 - 类比:相当于公共厕所的门锁,保证同一时间只有一个线程能访问受保护的资源 2. **变量名称** `pcie_write_mutex` - 根据命名可推测其用途:用于保护PCIe(外围组件互连快速总线)的写操作 - 在多线程环境中,当多个线程需要操作PCIe设备时,通过这个锁确保写操作的原子性 3. **初始化方式** `= PTHREAD_MUTEX_INITIALIZER` - 这是一个宏定义,用于静态初始化互斥锁(在编译时初始化) - 适用于全局变量或静态变量 - 对比动态初始化:如果是局部变量或需要设置非默认属性,应使用`pthread_mutex_init()`函数 4. **典型使用场景**: ```c void write_to_pcie() { pthread_mutex_lock(&pcie_write_mutex); // 加锁 // 执行PCIe写操作... pthread_mutex_unlock(&pcie_write_mutex);// 解锁 } ``` 5. **重要特性**: - 默认属性(快速互斥锁) - 不可递归(同一线程重复加锁会导致死锁) - 跨线程有效(不同线程可通过该锁实现同步) 6. **注意事项**: - 必须成对使用`lock()`和`unlock()` - 临界区代码应尽量简短 - 避免在临界区内调用可能阻塞的函数 - 静态初始化的互斥锁不需要手动销毁 扩展知识:在Linux内核中,PCIe操作本身是线程安全的,但在用户空间通过MMAP等方式直接操作PCIe设备时,就需要这样的显式同步机制来保证多线程安全访问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值