【问题标题】:Multithreading using threadpool使用线程池进行多线程
【发布时间】:2023-03-12 00:35:01
【问题描述】:

我目前正在使用线程数等于内核数的 boost 线程池。我已经使用池的计划功能安排了 10 个任务。例如, 假设我有这个功能

void my_fun(std::vector<double>* my_vec){
    // Do something here
}

这里的参数'my_vec'只是用来做一些临时计算。我将函数传递给它的主要原因是我想在再次调用该函数时重用这个向量。

目前,我有以下

// Create a vector of 10 vectors called my_vecs

// Create threadpool
boost::threadpool::pool tp(num_threads);

// Schedule tasks
for (int m = 0; m < 10; m++){
    tp.schedule(boost::bind(my_fun, my_vecs.at(m)));
}

这是我的问题:我想用只有 2 个向量替换 10 个向量的向量。如果我想调度 10 个任务并且我有 2 个内核,那么任何时候最多有 2 个线程(任务)在运行。所以我只想使用两个向量(一个分配给每个线程)并用它来执行我的 10 个任务。我该怎么做?

我希望这很清楚。谢谢!

【问题讨论】:

标签: c++ multithreading threadpool


【解决方案1】:

boost::thread_specific_ptr 可能是您需要的。以下是您如何在函数中使用它:

#include <boost/thread/tss.hpp>
boost::thread_specific_ptr<std::vector<double> > tls_vec;

void my_fun()
{
    std::vector<double>* my_vec = tls_vec.get();
    if( !my_vec ) {
        my_vec = new std::vector<double>();
        tls_vec.reset(my_vec);
    }
    // Do something here with my_vec
} 

它将在调度到同一线程的任务之间重用向量实例。如果池中有更多线程,则可能有超过 2 个实例,但由于其他答案中提到的抢占,您确实需要每个正在运行的线程而不是每个内核的实例。

您应该不需要删除存储在thread_specific_ptr 中的向量实例;当相应的线程完成时,它们将被自动销毁。

【讨论】:

    【解决方案2】:

    我不会将线程数限制为内核数。请记住,早在我们拥有多核处理器之前,多线程编程就已经开始了。这是因为线程可能会阻塞某些资源,并且下一个线程可以跳入并使用 CPU。

    【讨论】:

    • 软件线程切换很昂贵。通常不仅仅是等待大多数资源被加载(出于性能原因,我们在单核上没有多线程,它是为了多任务处理)。您所描述的是为什么我们有时在单个内核上有多个 硬件 线程。
    • 我不同意。有时它可能更贵,但我不同意这是典型的。您必须在逐个应用程序的基础上对此进行评估。相信我,单核上的多个线程当然可以提高性能。尤其是当一个线程负责 UI 交互时。例如,Apple 包括NSOperations for iPhone apps。 iPhone 是单核的,但 Apple 看到了对多线程的需求。
    • 我同意我的陈述过于笼统(您的 UI 示例很好)。但是对于仅计算?这就是我的问题。
    • 我可能应该提到所有线程都受 CPU 限制。
    【解决方案3】:

    Java 有一个 FixedThreadPool。

    看起来 Boost 可能有类似的东西

    http://deltavsoft.com/w/RcfUserGuide/1.2/rcf_user_guide/Multithreading.html

    基本上一个固定的线程池会产生固定数量的线程,然后你可以在管理器队列中排队任务。

    【讨论】:

      【解决方案4】:

      虽然只能同时调度两个线程是两个,但在许多线程系统上,线程会被时间分片,因此线程在执行其任务期间会被抢占。因此,第三个(第四个,...)线程将有机会工作,而第一个和第二个线程的处理仍未完成。

      我不知道这个特定的线程实现,但我的猜测是它将允许(或在支持的环境中运行)抢先调度。我对线程的想法是尽量保持简单,让每个线程都有自己的资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-02
        • 2019-10-12
        • 1970-01-01
        • 2011-09-23
        • 2011-07-14
        • 2011-11-23
        • 1970-01-01
        • 2015-06-26
        相关资源
        最近更新 更多