21xrx.com
2024-12-22 20:00:17 Sunday
登录
文章检索 我的文章 写文章
C++实现线程交替打印方案
2023-07-05 01:01:01 深夜i     --     --
C++ 线程 交替打印 方案 实现

多线程编程是当今计算机领域中的一个热点话题。多线程程序可以提高应用程序的性能,同时提高资源利用率。然而,多线程编写程序也是非常具有挑战性的,因为存在许多协调和同步的问题。

本文将介绍一种C++实现线程交替打印方案。这个问题可以很好地说明如何使用线程同步机制来解决多线程协调的问题。

问题描述

假设现在有两个线程A和B,需要交替打印从1到100的整数。线程A只能打印奇数,线程B只能打印偶数,打印完一个数之后,要释放锁让另外一个线程去打印下一个数。

解决方案

在C++中,可以使用标准线程库和互斥锁来解决这个问题。具体实现如下:

1. 定义两个全局变量odd和even,用于记录当前需要打印的奇数和偶数;

2. 定义一个互斥锁mutex,同步线程的访问;

3. 线程A打印奇数,先获取锁,打印出奇数,然后将奇数加上2,并用条件变量condA通知线程B开始打印下一个数;

4. 线程B打印偶数,先获取锁,打印出偶数,然后将偶数加上2,并用条件变量condB通知线程A开始打印下一个数;

5. 循环执行步骤3和步骤4,直到打印完1到100的整数。

下面是实现代码:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

using namespace std;

int odd = 1, even = 2;

mutex mtx;

condition_variable condA, condB;

void printOdd()

{

  while (odd <= 100)

  {

    unique_lock<mutex> lock(mtx);

    cout << "Thread A: " << odd << endl;

    odd += 2;

    condB.notify_one();

    condA.wait(lock);

  }

}

void printEven()

{

  while (even <= 100)

  {

    unique_lock<mutex> lock(mtx);

    cout << "Thread B: " << even << endl;

    even += 2;

    condA.notify_one();

    condB.wait(lock);

  }

}

int main()

{

  thread t1(printOdd);

  thread t2(printEven);

  t1.join();

  t2.join();

  return 0;

}

运行结果:


Thread A: 1

Thread B: 2

Thread A: 3

Thread B: 4

Thread A: 5

Thread B: 6

Thread A: 7

Thread B: 8

Thread A: 9

Thread B: 10

...

Thread A: 99

Thread B: 100

可以看到,线程A和线程B交替打印了1到100的整数,实现了我们的需求。这个例子展示了C++中如何使用互斥锁和条件变量来实现线程的同步。

总结

多线程编程是一个有挑战性的任务,其中一个主要问题是协调和同步不同的线程。C++中提供了丰富的线程库和同步机制,如互斥锁、条件变量等,可以很好地解决这些问题。本文介绍了一种使用互斥锁和条件变量实现线程交替打印的方案,通过这个例子,我们可以深入理解多线程编程的核心思想和方法。

  
  

评论区

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