21xrx.com
2024-11-22 12:44:51 Friday
登录
文章检索 我的文章 写文章
C++多线程下的条件变量使用
2023-06-27 19:05:11 深夜i     --     --
C++多线程 条件变量 使用

条件变量是在多线程编程中用于实现线程等待和唤醒的一种同步机制。在C++多线程编程中,条件变量通常与互斥量一起使用以实现线程同步。本文将介绍C++多线程中条件变量的使用方法。

1. 定义和初始化条件变量和互斥量

使用条件变量前,需要定义和初始化互斥量和条件变量:


std::mutex mutex;

std::condition_variable cond;

其中mutex是互斥量,cond是条件变量。

2. 等待条件变量

条件变量的等待需要在互斥量的保护下进行。等待条件变量时,线程会释放互斥量,并挂起自己,等待其他线程通过notify_one或notify_all来唤醒它。等待的代码如下:


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

cond.wait(lock);

其中unique_lock是锁的一种RAII方式的封装,lock会获取互斥量的所有权,而wait会释放互斥量并挂起线程,并在条件变量被通知时重新获取互斥量。

3. 唤醒等待条件变量的线程

当条件变量的状态满足某个条件时,需要唤醒等待条件变量的线程。唤醒线程通常有两种方式:notify_one和notify_all。notify_one会唤醒等待条件变量的一个线程,而notify_all会唤醒所有等待条件变量的线程。唤醒的代码如下:


cond.notify_one();

和等待条件变量一样,唤醒线程的操作也需要在互斥量的保护下进行。

4. 使用条件变量的例子

下面是一个使用条件变量的例子,其中一个线程输出奇数,另一个线程输出偶数:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mutex;

std::condition_variable cond;

int count = 1;

void print_odd() {

  while (count <= 10) {

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

    if (count % 2 == 0) {

      cond.wait(lock); // 等待偶数线程输出完毕

    }

    std::cout << "odd: " << count << std::endl;

    count++;

    cond.notify_one(); // 唤醒偶数线程

  }

}

void print_even() {

  while (count <= 10) {

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

    if (count % 2 != 0) {

      cond.wait(lock); // 等待奇数线程输出完毕

    }

    std::cout << "even: " << count << std::endl;

    count++;

    cond.notify_one(); // 唤醒奇数线程

  }

}

int main() {

  std::thread t1(print_odd);

  std::thread t2(print_even);

  t1.join();

  t2.join();

  return 0;

}

输出结果为:


odd: 1

even: 2

odd: 3

even: 4

odd: 5

even: 6

odd: 7

even: 8

odd: 9

even: 10

在输出奇数的线程中,如果当前count是偶数,则等待偶数线程输出完毕后再输出;在输出偶数的线程中,如果当前count是奇数,则等待奇数线程输出完毕后再输出。两个线程通过条件变量来进行同步。

  
  

评论区

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