21xrx.com
2024-12-22 22:48:47 Sunday
登录
文章检索 我的文章 写文章
C++11多线程-条件变量
2023-07-01 16:36:45 深夜i     --     --
C++11 多线程 条件变量

在C++11中引入了对多线程的支持,这使得开发者可以使用多线程来提高程序的性能和响应能力。在多线程编程中,条件变量是一个重要的概念,因为它可以让线程间进行同步和通信。

条件变量是一种线程同步机制,它可以让线程在等待某个条件满足时被挂起。条件变量通常结合互斥锁一起使用,以避免竞争条件的问题。

在C++11中,条件变量实现了两个主要函数wait()和notify_one()或notify_all()。wait()函数可以使线程进入等待状态,并释放互斥锁,以让其他线程可以访问共享变量。当wait()函数返回时,线程会重新获得互斥锁,并继续执行。而notify_one()或notify_all()函数可以唤醒一个或所有等待线程,以通知它们条件已经满足。

让我们看一个简单的例子。假设我们现在有两个线程,一个线程生产数字,另一个线程消费数字。我们希望生产者线程生产完数字后通知消费者线程来取这个数字。这可以使用条件变量来实现。

首先,我们需要定义一个互斥锁和一个条件变量。

std::mutex mu;

std::condition_variable cv;

然后,我们可以定义一个生产者线程和一个消费者线程。

void producer(std::queue & q) {

  for (int i = 0; i < 10; i++) {

    std::unique_lock lock(mu); // 获得互斥锁

    q.push(i); // 生产数字

    cv.notify_one(); // 通知消费者线程来取数字

  }

}

void consumer(std::queue & q) {

  for (int i = 0; i < 10; i++) {

    std::unique_lock lock(mu); // 获得互斥锁

    while (q.empty()) { // 如果队列为空,等待生产者线程生产数字

      cv.wait(lock);

    }

    int num = q.front();

    q.pop(); // 取数字

    std::cout << num << " "; // 输出数字

  }

}

在生产者线程中,我们使用notify_one()函数来通知消费者线程来取数字。在消费者线程中,我们使用wait()函数来等待生产者线程生产数字,并在互斥锁释放后挂起当前线程。

这篇文章介绍了如何使用C++11的条件变量来实现多线程编程中的同步和通信。条件变量可以帮助我们避免竞争条件的问题,并使线程之间可以更好地协作。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复