zoukankan      html  css  js  c++  java
  • 线程的同步与复用之 (互斥量)

    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上挂起等待,首先在把自己加入等待队列中,然后置线程状态为睡眠,然 后调用调度器函数切换到别的线程。一个线程要唤醒等待队列中的其它线程,只需从等待队 列中取出一 项,把它的状态从睡眠改为就绪,加入就绪队列,那么下次调度器函数执行时就有 可能切换到被唤醒的线程。
     
     
     
     
     
     
  • 相关阅读:
    lintcode 最长上升连续子序列 II(二维最长上升连续序列)
    lintcode 滑动窗口的最大值(双端队列)
    windows下实现Git在局域网使用
    eclipse导入web项目之后项目中出现小红叉解决办法
    HTTP协议基础
    c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
    Codeforces Round #327 (Div. 2) B. Rebranding C. Median Smoothing
    c语言表白程序代码
    矩阵的逆矩阵,伴随矩阵
    document.getElementById()与 $()区别
  • 原文地址:https://www.cnblogs.com/shihaochangeworld/p/5795417.html
Copyright © 2011-2022 走看看