互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的.
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源.
信号量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();}
};
};
网友评论