Linux下共享内存同步方法

同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情。由于多

个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等 。

信号量(semaphore),它是不同进程间或一个给定进程内部不同线程间同步的机制。信号量包

括:posix有名信号量、 posix基于内存的信号量(无名信号量) 和 System V信号量(IPC对象)。

【文章福利】小编推荐自己的Linux内核源码交流群:【869634926】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!Linux内核课程示例:

方法一:利用POSIX有名信号量实现共享内存的同步

有名信号量既可用于线程间的同步,又可用于进程间的同步。

两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进

程读,利用两个有名信号量“semr”, “semw”。semr信号量控制能否读,初始化为0。 semw信号量

控制能否写,初始为1。

以下这两段代码中,读程序刚开始会一直阻塞到写程序往内存中写入数据后,给读信号量

“semr”加1后才会继续运行。而写程序,由于刚开始的写信号量初始化为1,此时写信号量“semw”

在执行“sem_wait”后会减1。因此会直接执行写操作后,给读信号量“semr”加1,出发读程序继续往

下进行。

读共享内存的程序示例代码如下:

        // 创建一个名为"mysem_r"的读信号量(有名信号量)
        semr = sem_open("mysem_r", O_CREAT | O_RDWR , 0666, 0);
        if (semr == SEM_FAILED)
        {
                printf("errno=%d\n", errno);
                return -1;
        }
 
        // 创建一个名为"mysem_w"的写信号量(有名信号量)
        semw = sem_open("mysem_w", O_CREAT | O_RDWR, 0666, 1);
        if (semw == SEM_FAILED)
        {
                printf("errno=%d\n", errno);
                return -1;
        }
        
        // 创建共享内存区域
        if ((shmid = shmget(key,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值