将函数参数绑定到线程

时间:2011-01-19 00:39:22

标签: c++ multithreading function boost

我尝试使用boost调用带参数的函数,但它不起作用。代码就是这个

void Simulate::cr_number_threaded(lint nodes) {
    for(lint i = 0; i < trials_per_thread; i++) {
        // code
    }

}

void Simulate::run_cr_number() {
    vec_cr_number.clear();
    boost::thread t[threads];

    for(int i = 0; i < n_s.size(); i++) {
        // n_s[i] is the current number of nodes
        for(int t_idx = 0; t_idx < threads; t_idx++)
            t[t_idx] = boost::thread(cr_number_threaded, n_s[i]);
        // etc...
    }


}

我得到的错误如下:

  

Simulate.cpp:在成员函数'void中   模拟:: run_cr_number()':   Simulate.cpp:27:错误:没有匹配   呼叫功能   'boost :: thread :: thread(,long int&amp;)'

更新: 我按照建议。使用我得到的第一个解决方案

  

Simulate.cpp:在成员函数'void中   模拟:: run_cr_number()':   Simulate.cpp:28:错误:没有匹配   调用'bind(,long int&amp;)'的函数   ../../boost_1_44_0/boost/bind/bind.hpp:1472:   注意:候选人是:   升压:: _双向:: bind_t ::类型&GT;   boost :: bind(F,A1)[F = void   (Simulate :: *)(lint),A1 = long int]   ../../boost_1_44_0/boost/bind/bind.hpp:1728:   注:
  boost :: _ bi :: bind_t :: type,boost :: _ mfi :: dm,   类型名   升压:: _双向:: list_av_1 ::类型&GT;   boost :: bind(M T :: *,A1)[与A1 =   long int,M = void()(lint),T =   模拟]

使用第二个我改为

  

Simulate.cpp:在成员函数'void中   模拟:: run_cr_number()':   Simulate.cpp:28:错误:没有匹配   呼叫功能   “提高::螺纹::互换(升压:: _双:: bind_t,   提高:: _双::列表2,   boost :: _ bi :: value&gt; &GT)”   ../../boost_1_44_0/boost/thread/detail/thread.hpp:310:注意:候选人是:void   提高::螺纹::交换(升压::螺纹&安培;)

1 个答案:

答案 0 :(得分:1)

1)boost :: thread不是copyable而是swappable

2)您需要指定成员函数并传递实例

类似的东西:

t[t_idx].swap(boost::thread(&Simulate::cr_number_threaded, this, n_s[i]));

在这种情况下,您需要确保this比线程更长寿。