21xrx.com
2024-12-22 20:45:43 Sunday
登录
文章检索 我的文章 写文章
C++队列多线程实现
2023-07-08 11:42:25 深夜i     --     --
C++ 队列 多线程 实现

在C++编程中,队列与多线程的结合实现是非常普遍的。队列是一种数据结构,它可以用来存储和操作多个元素,而多线程则可用于更有效地利用计算机资源。在本文中,我们将讨论如何使用C++编写一个队列,以及如何通过多线程来实现它。

首先,我们需要定义一个队列数据结构。我们可以使用标准模板库(STL)中的queue类来实现一个简单的队列,如下所示:


#include <queue>

using namespace std;

queue<int> myQueue;

在上述代码中,我们创建了一个名为myQueue的队列,它存储整数类型。现在,我们可以使用队列的常用操作来向队列中添加数据、删除数据和访问队列中的元素。例如,以下代码将3添加到队列中:


myQueue.push(3);

而此代码则从队列中删除了至队首始的元素:


myQueue.pop();

另外,我们也可以使用队列的front()函数来访问位列顶端元素。例如,以下代码可以获取队列顶端的元素,并将其存储到一个名为myInt的整数变量中:


int myInt = myQueue.front();

现在,我们已经学会了如何使用C++实现一个简单的队列。接下来,我们需要讨论如何通过多线程来实现它。多线程可以提高我们程序的性能,因为它可以同时执行多个任务。对于队列来说,我们需要实现线程池来处理队列中的任务。其中,线程池是由若干个线程所组成的一组线程,可以用来同时执行多个任务。

以下是一个使用线程池实现队列多线程的示例代码:


#include <iostream>

#include <queue>

#include <mutex>

#include <thread>

#include <condition_variable>

using namespace std;

queue<int> myQueue;

mutex myMutex;

condition_variable myCV;

const int numThreads = 4;

void workerThread() {

  while (true) {

    unique_lock<mutex> lock(myMutex);

    myCV.wait(lock, [] { return !myQueue.empty(); });

    int task = myQueue.front();

    myQueue.pop();

    lock.unlock();

    // 执行任务

    cout << "Thread " << this_thread::get_id() << " processed task " << task << endl;

  }

}

int main() {

  thread workerThreads[numThreads];

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

    workerThreads[i] = thread(workerThread);

  }

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

    unique_lock<mutex> lock(myMutex);

    myQueue.push(i);

    lock.unlock();

    myCV.notify_one();

  }

  

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

    workerThreads[i].join();

  }

  return 0;

}

在上述代码中,我们定义了一个名为workerThread的函数,它用于执行队列中的任务。该函数使用了C++11中的线程锁和条件变量,用于保证线程的同步性及安全性。在workerThread函数中,我们使用了unique_lock 来锁住队列,进而实现了对任务队列的线程安全操作。此外,我们还使用了condition_variable实现了线程间的等待通信。

在主函数内,我们使用了4个线程来处理任务。其中每个线程都运行workerThread函数,并且在队列中有任务时才会执行。同时,我们还为队列中添加了10个任务,用于模拟实际的任务队列。最后,我们使用join()函数,等待所有线程执行完毕,并退出程序。

总之,队列与多线程的结合是C++编程中非常重要的领域,它能够使我们的程序更加高效、灵活和安全。通过理解并实现队列和多线程的关系,我们可以更好地应用它们到我们的实际项目中。

  
  

评论区

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