21xrx.com
2024-12-22 22:23:11 Sunday
登录
文章检索 我的文章 写文章
C++队列Queue多线程编程
2023-07-06 19:13:27 深夜i     --     --
C++ 队列 Queue 多线程编程

在C++编程中,队列是一个常见的数据结构,用于实现先进先出(FIFO)的操作。队列在许多应用程序中发挥着重要作用,例如生产者消费者模型、网络通信等等。而多线程编程又是一个十分重要的话题,因为现代计算机都有多个CPU核心,为了充分利用硬件资源,我们需要学习如何编写多线程程序,从而提高程序的性能和吞吐量。

在C++中,我们可以使用STL中的queue头文件实现队列功能,大大减少了代码实现的复杂性。在多线程编程中,我们可以使用线程安全的队列来避免竞争条件和不必要的锁,从而大幅度提高程序的效率。

线程安全队列的实现其实就是在普通队列的基础上加了互斥锁。由于互斥锁和条件变量操作是一个原子操作,所以可以使用条件变量来实现线程等待和唤醒,避免了不必要的轮询。

下面是一个示例程序,展示了如何使用C++的queue库和互斥锁来实现线程安全队列:

#include

#include

#include

#include

#include

std::queue my_queue;

std::mutex my_mutex;

std::condition_variable my_cv;

void producer()

{

  for (int i = 0; i < 5; ++i) {

    {

      std::unique_lock lock(my_mutex);

      my_queue.push(i);

      std::cout << "Produced: " << i << std::endl;

    }

    my_cv.notify_all();

    std::this_thread::sleep_for(std::chrono::milliseconds(100));

  }

}

void consumer()

{

  while (true) {

    std::unique_lock lock(my_mutex);

    while (my_queue.empty()) {

      my_cv.wait(lock);

    }

    int i = my_queue.front();

    my_queue.pop();

    std::cout << "Consumed: " << i << std::endl;

    lock.unlock();

    std::this_thread::sleep_for(std::chrono::milliseconds(100));

  }

}

int main() {

  std::thread t1(producer);

  std::thread t2(consumer);

  t1.join();

  t2.join();

  return 0;

}

在这个示例程序中,我们定义了一个queue my_queue、一个std::mutex my_mutex、一个std::condition_variable my_cv。producer函数是生产者,它会从0到4生产5个数据,push到队列中,并用std::cout输出生产数据的信息。consumer函数是消费者,它会不停地消费数据,从队列中取出数据并将消费数据的信息std::cout输出。在while循环中,我们使用了std::unique_lock获取了互斥锁my_mutex,并用while循环不停地判断队列是否为空。如果队列为空了,就调用my_cv.wait(lock)线程等待。直到其他线程向队列中push了数据,并通知了my_cv线程,consumer线程才会唤醒,继续执行。

可以使用多个生产者和消费者共同操作一个队列,使用线程安全队列可以避免竞争条件和不必要的锁,大大提高了程序的性能和吞吐量。

在编写多线程程序时,需要注意避免死锁和竞争条件等问题。C++的STL库提供了丰富的线程安全容器,可以简化多线程编程的实现难度,让我们更加轻松地编写高效的多线程程序。

  
  
下一篇: 介绍与使用

评论区

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