美文网首页
class CSpinMutex

class CSpinMutex

作者: 星夜兼程工作笔记 | 来源:发表于2020-04-10 10:24 被阅读0次

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的.

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源.

信号量mutex是sleep-waiting。 就是说当没有获得mutex时,会有上下文切换,将自己、加到忙等待队列中,直到另外一个线程释放mutex并唤醒它,而这时CPU是空闲的,可以调度别的任务处理。

而自旋锁spin lock是busy-waiting。就是说当没有可用的锁时,就一直忙等待并不停的进行锁请求,直到得到这个锁为止。这个过程中cpu始终处于忙状态,不能做别的任务。

互斥量值只能为0/1,信号量值可以为非负整数

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问

互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到

class CSpinMutex:no_copy

{

       pthread_spinlock_t  spin;

public:

        CSpinMutex() { pthread_spin_init(&spin,PTHREAD_PROCESS_PRIVATE);}

       ~CSpinMutex() {pthread_spin_destroy(&spin);}

        void Lock() {pthread_spin_lock(&spin);}

       void UnLock() {pthread_spin_unlock(&spin);}

      bool tryLock(){return pthread_spin_trylock(&spin);}

class scoped_lock:no_copy

{

      CSpinMutex  &ftx;

     void operator=(const scoped_lock&)(){}

public:

     scoped_lock(CSpinMutex & ft) : ftx(ft)   { ftx.Lock();}

      ~scoped_lock() { ftx.Unlock();}

};

};

相关文章

网友评论

      本文标题:class CSpinMutex

      本文链接:https://www.haomeiwen.com/subject/isplmhtx.html