本篇内容介绍了“什么是条件变量?Python中条件变量如何使用?”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的问题,接下来就让我带领大家学习一下有关这方面的知识吧!希望大家仔细阅读,能够有所帮助!
文章插图
1. 什么是条件变量?
条件变量它称得上是一种方法,主要用用在多线程程序中,可以实现等待和唤醒的操作,假设现在有两个线程一个线程a,一个线程b,使用wait这个动作可以阻塞挂起线程a,而使用notify这个动作就可以唤醒让线程b唤醒线程a 。然后a线程可以继续运行 。
条件变量一般用于多线程中,举个生活中的例子就像是生产者与消费者直接存在的关系,消费者怎么样才能知道生成者是否生产出了可以消费的产品,这里就可以通过while循环不停的去判断产品有没有可以用来消费的,在这个过程中如果遇到死循环是非常消耗CPU性能的,所以,为了降低CPU占用率,就需要使用条件变量来阻塞线程 。
2. 条件变量的使用
【什么是条件变量?Python中条件变量如何使用?】就以刚刚那个生产者和消费者关系问题举例,看下面这段代码:
std::mutex mutex; std::condition_variable cv; std::vector<int> vec; void Consume() { std::unique_lock<std::mutex> lock(mutex); cv.wait(lock); std::cout << "consume " << vec.size() << "\n"; } void Produce() { std::unique_lock<std::mutex> lock(mutex); vec.push_back(1); cv.notify_all(); std::cout << "produce \n"; } int main() { std::thread t(Consume); t.detach(); Produce(); return 0; }它的本来意思是去让消费者线程得到阻塞,等待生产者生产数据后再去通知消费者线程,这样消费者线程就可以拿到数据去消费 。
上面的代码中还存在一个问题,在代码中我们先执行的是“Produce()”,然后再去执行“Consume()”,这样就会使生产者提前创造出了数据,去通知消费者,但是此时消费者线程没有那么快执行到wait语句,线程没有等待这个条件变量上,那就没有生产者的通知信号了,后面Consume()中才执行wait处于等待状态,但此时生产者已经不会再触发notify,那消费者线程就会始终阻塞下去,出现bug 。
解决这个问题的方法代码如下:
std::mutex mutex; std::condition_variable cv; std::vector<int> vec; void Consumer() { std::unique_lock<std::mutex> lock(mutex); if (vec.empty()) { 加入一个判断条件 cv.wait(lock); } std::cout << "consumer " << vec.size() << "\n"; } void Produce() { std::unique_lock<std::mutex> lock(mutex); vec.push_back(1); cv.notify_all(); std::cout << "produce \n"; } int main() { std::thread t(Consumer); t.detach(); Produce(); return 0; }以上就是有关“什么是条件变量?Python中条件变量如何使用?”的内容,希望对你有所帮助!
推荐阅读
- 如何实现python中的链表反转?Python实现链表反转的方法是什么?
- Python中bytes是什么意思?Python字节类要怎么使用
- Python中的condition如何使用?python中condition条件变量的使用方法有哪些?
- 为什么纤瀛调整内衣可以扶正侧弯脊
- 天女木兰的花语和天女木兰的寓意
- 五种早餐越吃越傻 早餐第1口吃什么最养胃
- 冬季感冒怎么办 吃什么好得快
- 三七可散瘀止血消肿痛 什么时候吃三七粉好?
- 为什么淘宝开店上传不了身份证?有什么技巧?
- 细嚼慢咽才是养生之道?8个好方法让你养成细嚼慢咽的好习惯!