在新线程中启动方法

Posted

技术标签:

【中文标题】在新线程中启动方法【英文标题】:Launch method in new thread 【发布时间】:2013-03-10 16:21:37 【问题描述】:

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

这是代码,我无法编译:

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】:

您不能使用reference_wrapper 传递运行函数的对象。相反,您可以只传递一个指向您的对象的指针:

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

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

【讨论】:

以上是关于在新线程中启动方法的主要内容,如果未能解决你的问题,请参考以下文章

调用 removeCallbacks() 时,在新线程上启动的可运行对象不会停止

在新线程上设置本地通知?

在新创建的活动中保留对线程的引用

线程之Thread

ExecutorService的submit方法使用

Java并发----线程常见方法总结