新线程中的启动方法

时间:2013-03-10 16:21:37

标签: c++ multithreading boost-thread

我有一个带有指针对象的向量,我试图在一个新线程中启动对象的方法(方法有一个参数)。

这是我无法编译的代码:

class CanaSynchDynamic {
...
    void start() (boost::barrier&);
...
};

并在主要:

for(int i=0;i<pw;++i)
    vS1.push_back(new CanaSynchDynamic());

do {
        boost::barrier barrier(pw);
        boost::thread_group threads;
        for(int i=0;i<pw;++i)
            vS1[i]->more_steps(start,s[z]);
        for(int i=0;i<pw;++i)
            threads.create_thread(boost::bind(&CanaSynchDynamic::start,boost::ref(*(vS1[i])),boost::ref(barrier)));
        threads.join_all();

} while(something);

错误是:

    /usr/include/boost/thread/detail/thread.hpp: In instantiation of 'void
    boost::detail::thread_data<boost::reference_wrapper<T> >::run() [with F = CanaSynchDynamic]':
    simulation_3.cpp:278:1:   required from here
    /usr/include/boost/thread/detail/thread.hpp:98:17: error: no match for call to   '(CanaSynchDynamic) ()'

你有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您不能使用reference_wrapper来传递运行该函数的对象。相反,您只需将指针传递给对象:

threads.create_thread(boost::bind(&CanaSynchDynamic::start,vS1[i],boost::ref(barrier)));

此外,您可能只是将对象存储在向量中而不是指向它们的指针。如果您需要一个指针,请使用C ++ 11中的std::unique_ptr,如果不可用,可以使用boost::ptr_vector