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上挂起等待,首先在把自己加入等待队列中,然后置线程状态为睡眠,然 后调用调度器函数切换到别的线程。一个线程要唤醒等待队列中的其它线程,只需从等待队 列中取出一 项,把它的状态从睡眠改为就绪,加入就绪队列,那么下次调度器函数执行时就有 可能切换到被唤醒的线程。
     
     
     
     
     
     
  • 相关阅读:
    葡萄庄园 [图论]
    硬币游戏 [博弈论, 思维题]
    烹饪 [容斥]
    BZOJ1597 [Usaco2008 Mar]土地购买 [斜率优化]
    TCP IP协议
    soap协议
    xml的语法规则
    fiddler的使用
    常见默认端口
    智能休眠时间的使用
  • 原文地址:https://www.cnblogs.com/shihaochangeworld/p/5795417.html
Copyright © 2011-2022 走看看