21xrx.com
2024-09-19 09:49:10 Thursday
登录
文章检索 我的文章 写文章
C++条件变量的介绍和使用方法
2023-07-04 18:12:51 深夜i     --     --
C++ 条件变量 介绍 使用方法

C++是一种面向对象的编程语言,而条件变量是C++中常用的一种同步机制,用于线程之间的通信。为了更好地理解C++条件变量的介绍和使用方法,下面将从以下几个方面进行讲解。

一、什么是C++条件变量?

C++条件变量是一种同步机制,用于线程之间的通信。它允许线程在等待某些条件满足时被挂起,直到别的线程修改了这些条件并通知它们。

二、C++条件变量的使用方法

1. 定义条件变量

在C++中,要使用条件变量,需要先定义它。定义语法如下:


std::condition_variable cv;

2. 定义互斥锁

为了保证线程之间的数据同步,需要使用互斥锁。定义语法如下:


std::mutex mtx;

3. 等待条件的满足

如果条件不满足,线程需要等待。使用语法如下:


std::unique_lock<std::mutex> lck(mtx);

cv.wait(lck);

4. 修改条件并通知等待线程

当条件满足后,可以修改条件并通知等待线程。使用语法如下:


std::unique_lock<std::mutex> lck(mtx);

// 修改条件

cv.notify_all();

三、一个使用条件变量的例子

下面是一个使用条件变量的例子,具体实现了一个生产者消费者的问题。通过一个共享的缓冲区,实现生产者往缓冲区中添加数据,消费者从缓冲区中取出数据。


#include <iostream>

#include <thread>

#include <queue>

#include <chrono>

#include <condition_variable>

const int BUF_SIZE = 5;

int g_buffer[BUF_SIZE];

std::queue<int> g_queue;

std::condition_variable g_cond;

std::mutex g_mutex;

void producer(int id)

{

  for (int i = 0; i < BUF_SIZE; i++)

  {

    std::unique_lock<std::mutex> lock(g_mutex);

    while (!g_queue.empty())

    {

      // 缓冲区未空则阻塞生产者线程

      g_cond.wait(lock);

    }

    g_queue.push(i + id * BUF_SIZE);

    std::cout << "Producer " << id << " produced " << (i + id * BUF_SIZE)

         << std::endl;

    g_cond.notify_one();

    lock.unlock();

    std::this_thread::sleep_for(std::chrono::milliseconds(100));

  }

}

void consumer(int id)

{

  for (int i = 0; i < BUF_SIZE; i++)

  {

    std::unique_lock<std::mutex> lock(g_mutex);

    while (g_queue.empty())

    {

      // 缓冲区为空则阻塞消费者线程

      g_cond.wait(lock);

    }

    int data = g_queue.front();

    g_queue.pop();

    std::cout << "Consumer " << id << " consumed " << data << std::endl;

    g_cond.notify_one();

    lock.unlock();

    std::this_thread::sleep_for(std::chrono::milliseconds(100));

  }

}

int main()

{

  std::thread p1(producer, 0);

  std::thread p2(producer, 1);

  std::thread p3(producer, 2);

  std::thread c1(consumer, 0);

  std::thread c2(consumer, 1);

  p1.join();

  p2.join();

  p3.join();

  c1.join();

  c2.join();

  return 0;

}

上述代码首先定义了一个缓冲区,接着定义了生产者和消费者线程,其中生产者往缓冲区中添加数据,消费者从缓冲区中取出数据。其中,使用了条件变量来保证线程间通信的正确性。

总结

C++条件变量是一种常用的同步机制,它可以通过线程之间的通信,实现数据的同步和访问控制。要使用条件变量,需要先定义它,然后结合互斥锁使用,并使用该条件变量来等待和通知线程。所以,在使用C++多线程编程时,条件变量是一个非常重要的概念,需要理解掌握。

  
  

评论区

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