21xrx.com
2024-11-05 16:27:27 Tuesday
登录
文章检索 我的文章 写文章
C++编程:实现线程池
2023-07-12 17:22:13 深夜i     --     --
C++ 编程 线程池 实现 多线程

C++是一种流行的编程语言,广泛用于开发各种应用程序。在应用程序开发中,线程池是一个非常重要的概念。线程池是一组线程,它们可用于并发执行多个任务。在大多数应用程序中,线程池可用于提高性能和吞吐量。

在本文中,我将介绍如何在C++中创建一个线程池。实现一个线程池需要以下步骤:

1. 定义任务

2. 定义线程池类

3. 实现任务队列

4. 实现工作线程

5. 实现线程池

先来看一下,如何定义一个任务:


typedef function<void()> Task;

这里我们使用C++11提供的std::function特性来定义任务类型。任何可调用对象,不管是函数、函数指针或者是Lambda表达式, 都可以作为任务传给线程池。

接下来,我们需要定义线程池类。线程池类应该具有以下功能:

1. 向线程池中添加任务

2. 等待所有任务完成

3. 关闭线程池

定义线程池类的头文件如下:


class ThreadPool {

public:

  ThreadPool(int numThreads);

  ~ThreadPool();

  void AddTask(const Task& task);

  void WaitForAllTasks();

  void Shutdown();

private:

  bool m_running;

  vector<shared_ptr<thread>> m_threads;

  queue<Task> m_taskQueue;

  mutex m_mutex;

  condition_variable m_condition;

};

线程池类的实现分为几个步骤,首先是任务队列:


void ThreadPool::AddTask(const Task& task)

{

  unique_lock<mutex> lock(m_mutex);

  m_taskQueue.push(task);

  lock.unlock();

  m_condition.notify_one();

}

bool ThreadPool::HasTasks()

{

  lock_guard<mutex> lock(m_mutex);

  return (!m_taskQueue.empty());

}

Task ThreadPool::GetTask()

{

  unique_lock<mutex> lock(m_mutex);

  m_condition.wait(lock, [this] { return (!m_running || HasTasks()); });

  if (!m_running && m_taskQueue.empty())

    return Task();

  Task task = m_taskQueue.front();

  m_taskQueue.pop();

  return task;

}

这里我们使用一个std::queue来保存任务队列。AddTask()函数用于向任务队列中添加任务,HasTasks()函数用于检查是否有任务可以被执行,GetTask()函数用于获取任务。当任务队列不为空时,GetTask()函数会返回第一个任务。如果任务队列为空,GetTask()函数会等待新任务的到来。

下一步,我们需要实现工作线程:


void ThreadPool::WorkerThread()

{

  while (m_running)

  {

    Task task = GetTask();

    if (task)

    {

      task();

    }

  }

}

线程池中的工作线程通过GetTask()函数获取任务,执行完成后再获取下一个任务。当线程池被关闭时,工作线程会退出。

最后,我们需要实现线程池。我们可以通过创建一组线程来实现线程池:


ThreadPool::ThreadPool(int numThreads) :

  m_running(true)

{

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

  {

    m_threads.push_back(make_shared<thread>(&ThreadPool::WorkerThread, this));

  }

}

ThreadPool::~ThreadPool()

{

  m_running = false;

  m_condition.notify_all();

  for (auto thread : m_threads)

  {

    if (thread->joinable())

    {

      thread->join();

    }

  }

}

void ThreadPool::WaitForAllTasks()

{

  while (HasTasks())

  {

    this_thread::sleep_for(chrono::milliseconds(1));

  }

}

void ThreadPool::Shutdown()

{

  WaitForAllTasks();

  m_running = false;

  m_condition.notify_all();

}

这里,我们通过创建一组线程来实现线程池。每个线程都会调用WorkerThread()函数。当所有任务都被执行完毕后,线程池被关闭。

这样,我们就完成了C++线程池的实现。线程池可用于提高多线程应用程序的性能和效率。线程池不仅可以解决线程过多带来的资源浪费和性能瓶颈问题,也可以一定程度上提升代码可维护性和可扩展性。

  
  

评论区

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