• 线程的同步与复用之 (互斥量)


    A. mutex (互斥量)
    对于多线程的程序,访问冲突的问题是很普遍的, 引入互斥用来保证在任一时刻,只能有一个线程访问该对象, 来保证共享数据操作的完整性 。
    解决的办法是引入互斥锁(Mutex,Mutual Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得 锁的线程只能等待而不能访问共享数据,这样“读-修改-写”三步操作组成一个原子操作,要么 都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作。
     
    //初始化
    int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr); 
    pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;
    //销毁
    int pthread_mutex_destroy (pthread_mutex_t *__mutex);
    //try上锁
    int pthread_mutex_trylock (pthread_mutex_t *__mutex); 
    //上锁
    int pthread_mutex_lock (pthread_mutex_t *__mutex); 
    //解锁
    int pthread_mutex_unlock (pthread_mutex_t *__mutex);
     
     
    一个线程可以调用pthread_mutex_lock获得Mutex,如果这时另一个线程已经调用 pthread_mutex_lock获得了该Mutex,则当前线程需要挂起等待,直到另一个线程调用 pthread_mutex_unlock释放Mutex,当前线程被唤醒,才能获得该Mutex并继续执行。
    如果一个线程既想获得锁,又不想挂起等待,可以调用pthread_mutex_trylock,如果Mutex已 经被 另一个线程获得,这个函数会失败返回EBUSY,而不会使线程挂起等待。
    每个Mutex有一个等待队 列,一个线程要在Mutex上挂起等待,首先在把自己加入等待队列中,然后置线程状态为睡眠,然 后调用调度器函数切换到别的线程。一个线程要唤醒等待队列中的其它线程,只需从等待队 列中取出一 项,把它的状态从睡眠改为就绪,加入就绪队列,那么下次调度器函数执行时就有 可能切换到被唤醒的线程。
     
     
     
     
     
     
  • 相关阅读:
    list与map的区别
    [BJOI2019]光线——递推
    [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
    [BJOI2019]送别——非旋转treap
    [BJOI2019]排兵布阵——分组背包
    [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
    BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
    BZOJ3033太鼓达人——哈密顿回路/欧拉回路
    BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块
    BZOJ2339[HNOI2011]卡农——递推+组合数
  • 原文地址:https://www.cnblogs.com/shihaochangeworld/p/5795417.html
Copyright © 2020-2023  润新知