21xrx.com
2024-11-05 14:36:42 Tuesday
登录
文章检索 我的文章 写文章
使用C++编程,实现三个线程按照顺序打印ABC
2023-07-11 11:52:58 深夜i     --     --
C++ 三个线程 顺序打印 ABC

在多线程的编程中,按照顺序打印字母ABC是一个经典的案例。这个问题看似简单,但是实际上非常复杂。要用到很多多线程的知识来实现。下面我们来介绍一下如何用C++编程实现三个线程按照顺序打印ABC。

首先,我们需要三个线程,一个线程打印字母A,另一个线程打印字母B,第三个线程打印字母C。这个问题就是要保证这三个线程按照顺序执行。

我们可以用信号量来实现这个问题。信号量是一个特殊的变量,用来控制多个线程对共享资源的访问。我们定义三个信号量,分别用来控制打印A、打印B和打印C的线程。初始时,信号量A的值为1,信号量B和C的值为0。

在打印A的线程中,首先要获取信号量A,如果获取不到,则等待。如果获取到了信号量A,则打印A,然后释放信号量B。

在打印B的线程中,首先要获取信号量B,如果获取不到,则等待。如果获取到了信号量B,则打印B,然后释放信号量C。

在打印C的线程中,首先要获取信号量C,如果获取不到,则等待。如果获取到了信号量C,则打印C,然后释放信号量A。

这个过程会一直循环下去,直到程序结束。

下面是代码的实现:


#include <stdio.h> 

#include <stdlib.h>

#include <pthread.h> 

#include <semaphore.h>

sem_t semA, semB, semC;

void* threadA(void* arg)

{

  while (1)

  {

    sem_wait(&semA);

    printf("A");

    sem_post(&semB);

  }

  return NULL;

}

void* threadB(void* arg)

{

  while (1)

  {

    sem_wait(&semB);

    printf("B");

    sem_post(&semC);

  }

  return NULL;

}

void* threadC(void* arg)

{

  while (1)

  {

    sem_wait(&semC);

    printf("C");

    sem_post(&semA);

  }

  return NULL;

}

int main(int argc, char *argv[])

{

  pthread_t tidA, tidB, tidC;

  sem_init(&semA, 0, 1);

  sem_init(&semB, 0, 0);

  sem_init(&semC, 0, 0);

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

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

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

  pthread_join(tidA, NULL);

  pthread_join(tidB, NULL);

  pthread_join(tidC, NULL);

  sem_destroy(&semA);

  sem_destroy(&semB);

  sem_destroy(&semC);

  return 0;

}

运行代码,我们会看到控制台输出了无限重复的ABC字符串,这说明我们成功地用C++实现了三个线程按照顺序打印ABC的任务。

  
  

评论区

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