• 进程间同步(1)——条件变量和互斥量


    1. 概述

    条件变量和互斥量是最基本的同步形式,总是用于同步同一个进程的各个线程间同步

    当把条件变量或互斥量放在共享内存区时,可用于进程间同步

    同样的情况还有读写锁,它们都是随进程的持续性

     

    2.互斥锁

    互斥锁指代相互排斥,用于保护临界区。多个线程和多个进程分享的共享数据。

    静态初始化:static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

    动态初始化:互斥锁是动态分配的,pthread_mutex_init(&mutex);初始化

     

    上锁和解锁

    #include <pthread.h>

    int pthread_mutex_lock(pthread_mutex_t *mptr);

    int pthread_mutex_trylock(pthread_mutex_t *nptr);      //非阻塞上锁,出错EBUSY

    int pthread_mutex_unlock(pthread_mutex_t *mptr);

    成功:0; 出错:EXXX

    管道,消息队列同步是隐式的,内核会处理同步。

    共享缓冲区线程间的必须是显示同步

    加锁和解锁必须是同一个线程,信号量没有这个限制

     

    3.等待与信号发送

    互斥锁用于上锁不能用于等待。信号量两者都可以。

    条件变量pthread_cond_t用于等待

    #include <pthread.h>

    int pthread_cond_wait(pthread_cond_t *cptr, pthread_mutex_t *mptr);//等待某一条件变量被发送,此时会解锁互斥量。唤醒后会重新加锁

    int pthread_cond_singal(pthread_cond_t *cptr);//信号发送

    成功: 0; 出错:正的EXXX

    每个条件变量有一个信号量与之相关联,wait等待某个条件为真时,会指定其条件变量的地址和所关联的互斥锁的地址,目的是用互斥锁给条件变量加锁

    注意:在等待条件变量时要检测条件

    while(条件为假){//可能有虚假的唤醒

    pthread_cond_wait(…);

    4.属性

    对于条件变量我们可以pthread_cond_broadcast广播,和pthread_cond_timewait定时等待

    条件变量和互斥锁默认具有单个进程的线程间共享属性PTHREAD_PROCESS_PRIVATE, 可以改变为进程间共享属性PTHREAD_PROCESS_SHARED

    //先初始化属性,再设置共享,最后初始化互斥锁

    pthread_mutexattr_t mattr;

    pthread_mutexattr_init(&mattr);

    pthread_mutexattr_setshared(&mattr, PTHREAD_PROCESS_SHARED);//在进程间共享互斥锁,锁要放在共享内存区

    //使用属性初始化锁

    pthread_mutex_t *mptr;

    pthread_mutex_init(mptr, &mattr);

    可以利用同样的方法初始化pthread_cond_t

  • 相关阅读:
    Some day some time we will do
    qemu-img 的使用
    虚拟化qemu-img的简单用法。
    linux 后台执行命令
    C#向服务器上传文件问题
    Canvas保存为图片
    一个Sql备注
    fabric Clone
    Js 正则获取Html元素
    Graphic 完成文字缩放
  • 原文地址:https://www.cnblogs.com/hancm/p/3885827.html
Copyright © 2020-2023  润新知