holyya.com
2025-09-04 12:48:08 Thursday
登录
文章检索 我的文章 写文章
C++多线程打印ABC
2023-06-20 22:16:32 深夜i     --     --
C++ 多线程 打印 ABC

多线程编程是当前程序设计中的热点话题,它可以让程序在多个线程中同时执行,并发执行,以提高程序执行效率。今天我们来讲一下C++多线程打印ABC的实现方法。

在C++中,可以使用线程库来创建线程,其中,pthread是C++中常用的线程库。这里我们将使用pthread库来实现多线程打印ABC。

首先,我们需要创建三个线程,每个线程分别负责输出A、B、C。为了让线程之间能够正常通信,每个线程之间应该包含一个条件变量和一个互斥锁,用于控制线程打印的顺序。

接着,在每个线程中,我们需要使用while循环实现循环打印A、B、C。在打印一个字符后,线程需要通知下一个线程,并释放互斥锁,让下一个线程能够被唤醒执行。

最后,我们需要在主线程中按照线程启动的顺序依次加锁,从而保证线程打印的顺序。这样,就可以用多线程方式实现ABC的循环打印了。

下面是示例代码:

#include

#include

using namespace std;

// 定义三个线程

pthread_t threadA, threadB, threadC;

// 定义三个条件变量和互斥锁

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t condA = PTHREAD_COND_INITIALIZER, condB = PTHREAD_COND_INITIALIZER, condC = PTHREAD_COND_INITIALIZER;

void *PrintA(void *arg)

{

  while (true)

  {

    // 加锁

    pthread_mutex_lock(&mutex);

    // 打印A

    cout << "A" << flush;

    // 通知下一个线程

    pthread_cond_signal(&condB);

    // 等待被唤醒

    pthread_cond_wait(&condA, &mutex);

    // 解锁

    pthread_mutex_unlock(&mutex);

  }

}

void *PrintB(void *arg)

{

  while (true)

  {

    // 加锁

    pthread_mutex_lock(&mutex);

    // 打印B

    cout << "B" << flush;

    // 通知下一个线程

    pthread_cond_signal(&condC);

    // 等待被唤醒

    pthread_cond_wait(&condB, &mutex);

    // 解锁

    pthread_mutex_unlock(&mutex);

  }

}

void *PrintC(void *arg)

{

  while (true)

  {

    // 加锁

    pthread_mutex_lock(&mutex);

    // 打印C

    cout << "C " << endl;

    // 通知下一个线程

    pthread_cond_signal(&condA);

    // 等待被唤醒

    pthread_cond_wait(&condC, &mutex);

    // 解锁

    pthread_mutex_unlock(&mutex);

  }

}

int main()

{

  // 创建三个线程

  pthread_create(&threadA, NULL, PrintA, NULL);

  pthread_create(&threadB, NULL, PrintB, NULL);

  pthread_create(&threadC, NULL, PrintC, NULL);

  // 主线程等待三个子线程

  pthread_join(threadA, NULL);

  pthread_join(threadB, NULL);

  pthread_join(threadC, NULL);

  return 0;

}

总之,多线程打印ABC是一个简单而典型的多线程编程例子,它可以帮助我们初步理解多线程编程的基本原理和操作方法。在实际编程中,我们还可以通过继承pthread库实现更复杂的多线程程序,以应对各种不同的场景需求。

  
  

评论区

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