线程之间存在着相互制约的关系,具体可分为互斥和同步这两种关系。
在程序中,通常都会用到叫做”临界资源“的东西,可能是一块内存,一个数据结构,一个文件等具有排他性使用的东西。这些东西,在多线程环境下,必须进行互斥处理,才能安全地使用临界资源。所以,对临界资源执行互斥操作的代码片段,叫做临界区。
互斥量
通常使用QMutex,QMutexLocker这两个类进行互斥操作。举一个简单的例子:
int createKey(){mutex.lock();++key;return key;mutex.unlock();}
int createKey(){QMutexLocker locker(&mutex);++key;return key;}
第一个代码片段,虽然使用了lock()操作,但unlock()操作在return之后,从而导致unlock()操作永远无法进行。
第二个代码片段locker()函数作为局部变量会在函数退出时结束其作用域,从而自动对互斥量mutex解锁。
信号量
信号量可以理解为对互斥功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。信号亮的典型用例是控制生产者/消费者之间共享的环形缓冲区。
嗯生产者消费者问题,操作系统也讲过啊。