多进程共享的pthread_mutex_t

这篇具有很好参考价值的文章主要介绍了多进程共享的pthread_mutex_t。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

设置方式

  1. 要有一片多进程能一起访问的共享内存。共享内存如何获得本文不做介绍,请自行google。
  2. 共享内存划一段大小为sizeof(pthread_mutex_t)的内存备用,记这片内存为mutex_reserve。把这片内存初始化为全0。
  3. 用pthread_mutex_t的指针mutex_p指向mutex_reserve。
  4. 构造phtread_mutex_t的初始化属性结构体pthread_mutexattr_t attr。
  5. 设置attr为PTHREAD_PROCESS_SHARED。
  6. 用attr初始化mutex_p指向的phtread_mutex_t。

答疑

1.用NULL初始化共享内存中的pthread_mutex_t可以吗?也就是省略掉步骤4和5。

答:不完全可以。不用被设置为PTHREAD_PROCESS_SHARED的attr初始化mutex,mutex也能保证互斥:实验表明,如果进程不调用sleep(),省略与不省略步骤4-5的结果是一样的,没有任何两个进程同时进入临界区。但是如果有一个进程带锁休眠(lock后调用sleep(1))。则它有可能使得其他进程不能再获得锁。永久阻塞在lock函数上。至于为什么我也不知道。不设置PTHREAD_PROCESS_SHARED可能还有其他不预期的事发生,所以还是设置PTHREAD_PROCESS_SHARED好。

2.看到一篇博客说,pthread_mutexattr_t也需要在共享内存中

答:不需要。它就是mutex初始化时的一个指导,这个指导在哪个位置并不重要。

3. 第二点,不初始化那片内存为全0可以吗?

答:不可以。pthread_mutex_init有个规定,那就是它init的那片内存为全0。文章来源地址https://www.toymoban.com/news/detail-812593.html

参考代码

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>  //open
#include<sys/mman.h>
#include<string.h>
int id;
int main()
{
    int fd=open("test_shared_lock_a",O_RDWR|O_CREAT,0777);
    int result=ftruncate(fd,sizeof(pthread_mutex_t)+sizeof(pthread_mutexattr_t)+sizeof(int)*40);
    pthread_mutex_t *mutex=(pthread_mutex_t *)mmap(NULL,sizeof(pthread_mutex_t)+sizeof(pthread_mutexattr_t)+sizeof(int)*40,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    memset(mutex,0,sizeof(pthread_mutex_t)+sizeof(pthread_mutexattr_t)+sizeof(int)*40);
    int* num=(int*)((char*)mutex+sizeof(pthread_mutex_t)+sizeof(pthread_mutexattr_t));
    for(int i=0;i<40;i++)
    {
        num[i]=0;
    }
   pthread_mutexattr_t* attr=NULL;

   /* 下面三行,把pthread_mutexattr_t放在了共享内存中。*/
    // attr=(pthread_mutexattr_t*)((char*)mutex+sizeof(pthread_mutex_t));
    // pthread_mutexattr_init(attr);
    // pthread_mutexattr_setpshared(attr, PTHREAD_PROCESS_SHARED);


     /* 下面四行,pthread_mutexattr_t没有放在共享内存中。*/
    pthread_mutexattr_t s;
    attr=&s;
    pthread_mutexattr_init(attr);
    pthread_mutexattr_setpshared(attr, PTHREAD_PROCESS_SHARED);

	// 上面7行如果都注释,则为不使用attr初始化mutex。
    pthread_mutex_init(mutex,attr);
	//创建39个子进程。并且每个进程获得一个id。
    for(int i=0;i<39;i++)
    {
        id=i+1;
        int pid=fork();
        if(pid==0)
        {
            break;
        }
        else
        {
            if(id==39)
            {
                id=0;
            }
        }
    }
    //每个进程报告自己的pid。
    printf("%d report!\n",getpid());
    //if(id!=0)
    {
        //开始检测是否有多个进程同时进入临界区。
        int j=1;
        while(j-->0)
        {
            printf("%d try to lock!\n",getpid());
            pthread_mutex_lock(mutex);
            printf("%d get lock\n",getpid());
            //拿到锁后,在对应位置做标记,表示自己进入临界区。
            num[id]=1;
            int sum=0;
            for(int i=0;i<40;i++)
            {
            sum+=num[i];
            }
            if(sum>1)
            {
                printf("%d lock_failed!\n",getpid()); //如果有两个进程同时进入临界区,sum必定大于0。
            }
            else
            {
                printf("%d test_ok\n",getpid());  //如果sum为1,说明只有一个进程进入临界区。
            }
            num[id]=0;
            sleep(1);
            pthread_mutex_unlock(mutex);
        }
    }
    
}

到了这里,关于多进程共享的pthread_mutex_t的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux线程(4)——pthread_detach()自动回收线程资源

    分离线程                 默认情况下,当线程终止时,其它线程可以通过调用 pthread_join()获取其返回状态、回收线程资源,有时,程序员并不关心线程的返回状态,只是希望系统在线程终止时能够自动回收线程资源并将其移除。在这种情况下,可以调用 pthread_detach

    2024年02月03日
    浏览(38)
  • linux_进程锁与文件锁-pthread_mutexattr_init函数-pthread_mutexattr_setpshared函数

    接上一篇:linux_信号量函数系列-信号量实现生产者消费者模型-sem_init函数-sem_wait函数-sem_post函数-sem_trywait函数   今天来分析进程锁和线程锁,进程锁需要用到 pthread_mutexattr_init函数、pthread_mutexattr_destroy函数、pthread_mutexattr_setpshared函数 ,而文件锁则需要用到 fcntl函数 ,话

    2024年02月02日
    浏览(37)
  • Linux多线程编程- pthread_self()

    pthread_self() 函数是 POSIX 线程库的一部分,它提供了一个非常简单的功能:获取当前线程的唯一标识符。这个标识符是 pthread_t 类型的,通常是一个无符号的长整型值,不过具体的类型是由实现定义的,这意味着它可以在不同的操作系统上有不同的表示。 这个标识符对于调试多

    2024年02月06日
    浏览(33)
  • 线程间互斥-mutex互斥锁和lock_guard

    锁+双重判断的技法 竟态条件:多线程程序执行的结果一致,不会随着CPU对线程不同的调用顺序 线程不安全的代码如下 输出的部分结果里有很多重复的数字,相当于同一张票被卖出多次,原因在于 ticketCount–; 是线程不安全的,理由如下 某一时刻ticketCount = 99,thread1此时调用

    2024年02月03日
    浏览(36)
  • Visual Studio (2022)安装配置pthread.h多线程库

    各位好,之前尝试用DEVC++编写多线程库问题时遇到报错,然后发现解决不了后转战Visual Studio。顺带分享一下安装方法。 首先是pthread的下载网站:https://www.mirrorservice.org/sites/sourceware.org/pub/pthreads-win32/ 选择最新的(最下面)那个版本下载。 Windows选下面那个  解压完成后我们会

    2024年02月08日
    浏览(48)
  • linux_设置线程属性-pthread_attr_t结构体-设置线程分离态-修改线程栈的大小-NPTL

    接上一篇:linux_线程分离pthread_detach函数-线程取消pthread_cancel函数-线程相等pthread_equal函数   本次来分享linux线程的属性设置,线程属性主要是一个结构体 pthread_attr_t ,这个结构体中的成员就是线程的属性了,需要通过一系列的函数来修改,话不多说,上菜: 此博主在CSD

    2024年02月02日
    浏览(40)
  • 从汇编角度解释线程间互斥-mutex互斥锁与lock_guard的使用

    我们创建三个线程同时进行购票,代码如下  我们再看这段代码的汇编过程  汇编代码如下: 上述汇编过程的解读为: 将ticketCount的值从内存放到寄存器eax 通过寄存器完成减法操作 将运算结果再从eax寄存器中放到内存中 可以看到,三个线程在执行代码时,每个线程在执行到

    2024年02月19日
    浏览(34)
  • UNIX网络编程:socket & pthread_create()多线程 实现clients/server通信

    UNIX网络编程:socket fork()多进程 实现clients/server通信 随笔介绍了通过fork()多进程实现了服务器与多客户端通信。但除了多进程能实现之外,多线程也是一种实现方式。 重要的是,多进程和多线程是涉及操作系统层次。随笔不仅要利用pthread_create()实现多线程编程,也要理解线

    2024年02月06日
    浏览(52)
  • Linux网络编程:socket & pthread_create()多线程 实现clients/server通信

    UNIX网络编程:socket fork()多进程 实现clients/server通信 随笔介绍了通过fork()多进程实现了服务器与多客户端通信。但除了多进程能实现之外,多线程也是一种实现方式。 重要的是,多进程和多线程是涉及操作系统层次。随笔不仅要利用pthread_create()实现多线程编程,也要理解线

    2024年02月05日
    浏览(46)
  • (26)Linux 进程通信之共享内存(共享储存空间)

    共享内存是System V版本的最后一个进程间通信方式。 共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内

    2024年01月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包