多线程编程总结1
先让我们来看个例子:
这段代码看似没问题,其实犯了一个很严重的错误,也是今天开发过程中出现的问题。
首先,thread创建了一个线程,线程在获得到锁后,调用条件变量的wait方法对线程进行阻塞,同时释放锁。于是乎,系统调度进行上下文切换至main函数的主线程,这可能是我们所想的“理想调度顺序”。
但是,换个思维去想,操作系统也可能先调度main函数的主线程,等到t.join()被阻塞后,再调度t线程,这样就会出现一个问题:没有任何一个线程被阻塞在条件变量上时,就发送唤醒线程的通知了。这样会导致咱们的t线程会一直阻塞,永远无法被唤醒(因为唤醒通知早早的就被发送出去了........)。
我们需要改进以下代码:
通过while避免被notify_one提前唤醒后,程序被阻塞在一个永远不可能被唤醒的线程上,为什么不用if来作判断?就不多说了,就是用来应付类似多个消费者的情况。