4

希望同时多次调用一个函数。我希望使用线程来调用一个函数,该函数将充分利用机器的能力。这是一台8核的机器,我的要求是使用机器cpu从10%到100%以上。

我的要求是使用 boost 类。有什么方法可以使用 boost 线程或线程池库来完成此任务吗?或者其他方式来做到这一点?

另外,如果我每次都必须调用具有不同参数的多个函数(使用单独的线程),那么最好的方法是什么?[使用boost或不使用boost]以及如何?

#include <iostream>
#include <fstream>
#include <string.h>
#include <time.h>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>

using namespace std;
using boost::mutex;
using boost::thread;

int threadedAPI1( );
int threadedAPI2( );
int threadedAPI3( );
int threadedAPI4( );

int threadedAPI1( ) {
    cout << "Thread0" << endl;
}


int threadedAPI2( ) {
    cout << "Thread1" << endl;
}

int threadedAPI3( ) {
    cout << "Thread2" << endl;
}

int threadedAPI4( ) {
    cout << "Thread3" << endl;
}

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

    boost::threadpool::thread_pool<> threads(4);
    // start a new thread that calls the "threadLockedAPI" function
    threads.schedule(boost::bind(&threadedAPI1,0));
    threads.schedule(boost::bind(&threadedAPI2,1));
    threads.schedule(boost::bind(&threadedAPI3,2));
    threads.schedule(boost::bind(&threadedAPI4,3));
    // wait for the thread to finish
    threads.wait();

    return 0;
}

以上不起作用,我不确定为什么?:-(

4

3 回答 3

6

我建议您阅读有关您使用的功能的文档。从您在詹姆斯霍普金的回答中的评论来看,您似乎不知道 boost::bind 的作用,而只是简单地复制粘贴了代码。

boost::bind 接受一个函数(称为 f),以及可选的多个参数,并返回一个函数,该函数在调用时使用指定的参数调用 f。

也就是说,boost::bind(threadedAPI1, 0)()(创建一个不带参数并使用参数 0 调用 threadedAPI1() 的函数,然后调用它)等价于threadedAPI1(0).

由于您的线程 API 函数实际上并不接受任何参数,因此您不能将任何参数传递给它们。这只是基本的 C++。您不能调用threadedAPI1(0),而只能调用 ,但是threadedAPI1()当您调用该函数时,您尝试(通过 boost::bind)将整数 0 作为参数传递。

因此,您的问题的简单答案是简单地定义 threadedAPI1 如下:

int threadedAPI1(int i);

但是,避免 boost::bind 调用的一种方法是在启动线程时调用仿函数而不是自由函数。声明一个类似这样的类:

struct threadedAPI {
  threadedAPI(int i) : i(i) {} // A constructor taking the arguments you wish to pass to the thread, and saves them in the class instance.

  void operator()() { // The () operator is the function that is actually called when the thread starts, and because it is just a regular class member function, it can see the 'i' variable initialized by the constructor
    cout << "Thread" << i << endl; // No need to create 4 identical functions. We can just reuse this one, and pass a different `i` each time we call it.
  }
private:
  int i;
};

最后,根据您的需要,普通线程可能比线程池更适合。一般来说,线程池只运行有限数量的线程,因此它可能会将一些任务排队,直到其中一个线程完成执行。它主要适用于您有许多短期任务的情况。

如果您有固定数量的持续时间较长的任务,则为每个任务创建一个专用线程可能是可行的方法。

于 2008-12-05T18:22:53.770 回答
4

您将参数绑定到不带参数的函数:

int threadedAPI1( );

boost::bind(&threadedAPI1,0)

如果没有参数,直接传递函数即可:

threads.schedule(&threadedAPI1)
于 2008-12-05T17:01:33.950 回答
3

如果您对高效使用处理器感兴趣,那么您可能需要考虑英特尔线程构建块http://www.intel.com/cd/software/products/asmo-na/eng/294797.htm。我相信它是专门为使用多核处理器而设计的,而增强线程将控制权留给用户(即,与双核相比,四核上的 TBB 线程会有所不同)。

至于您的代码,您正在绑定不将参数传递给参数的函数。为什么?您可能还想检查计划中的返回代码。

于 2008-12-05T15:24:32.430 回答