21xrx.com
2024-12-23 00:31:54 Monday
登录
文章检索 我的文章 写文章
C++多线程打印奇偶数
2023-06-27 15:24:03 深夜i     --     --
C++ 多线程 奇偶数 打印

C++是一门功能强大的编程语言,多线程编程在这门语言中也得到了很好的支持。在本文中,我们将介绍如何使用C++多线程打印奇偶数。

首先,我们需要创建两个线程,一个线程用于打印奇数,另一个线程用于打印偶数。为了实现这两个线程的协同工作,我们需要使用互斥锁和条件变量。互斥锁用于确保每个线程在访问共享资源时不会冲突,条件变量用于在两个线程之间进行同步和通信。

下面是实现代码:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex m;

std::condition_variable cv;

bool isOdd = true;

void printOdd() {

  for (int i = 1; i <= 10; i += 2) {

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

    cv.wait(lock, []() return isOdd; );

    std::cout << i << std::endl;

    isOdd = false;

    cv.notify_one();

  }

}

void printEven() {

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

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

    cv.wait(lock, []() return !isOdd; );

    std::cout << i << std::endl;

    isOdd = true;

    cv.notify_one();

  }

}

int main() {

  std::thread t1(printOdd);

  std::thread t2(printEven);

  t1.join();

  t2.join();

  return 0;

}

在上面的代码中,我们创建了两个线程printOdd和printEven,这两个线程分别用于打印奇数和偶数。isOdd是一个布尔值变量,用于标识当前应该打印奇数还是偶数。互斥锁m用于确保在访问共享资源时不会发生冲突。条件变量cv用于在线程之间进行同步和通信。

在printOdd函数中,我们使用了一个for循环,从1开始每隔2个数打印一个奇数。在循环体内,我们使用了一个unique_lock来锁定互斥锁m。然后,使用条件变量cv的wait函数来等待printEven线程打印偶数。wait函数接受一个谓词作为参数,如果谓词返回false,则线程会一直等待。当其他线程调用notify_one函数时,wait函数将返回并继续执行下去。在打印完奇数后,我们将isOdd设置为false,表示下一次应该打印偶数,并使用notify_one函数来通知printEven线程醒来。

在printEven函数中,我们使用类似的方式来打印偶数。唯一不同的是,当打印完偶数后,我们将isOdd设置为true,表示下一次应该打印奇数。

在main函数中,我们创建了两个线程t1和t2,并分别将printOdd和printEven作为它们的入口函数。然后,我们使用join函数等待它们的执行完成。

总结

在本文中,我们介绍了如何使用C++多线程打印奇偶数。通过使用互斥锁和条件变量,我们在两个线程之间实现了同步和通信,使得它们能够协同工作。这种方法可以应用于其他需要协同工作的多线程场景。

  
  

评论区

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