无法通过引用传递给线程

时间:2017-07-29 13:56:38

标签: c++ multithreading zeromq

我试图通过引用传递一个线程,一个定义为的变量:

zmq::context_t context(1);
像这样:

t[thread_nbr] = std::thread(worker_routine, (void *)&context, trained_images);

然而,当我这样做时,我收到以下错误:

/usr/include/c++/5/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of<void* (*(void*, std::vector<TrainedImage>))(void*, std::vector<TrainedImage>&)>’
   typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                         ^
/usr/include/c++/5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<void* (*(void*, std::vector<TrainedImage>))(void*, std::vector<TrainedImage>&)>’
     _M_invoke(_Index_tuple<_Indices...>)

如果我尝试使用std::ref(),我会收到删除的功能错误。

有谁知道我能做什么?

1 个答案:

答案 0 :(得分:2)

问题似乎是你的线程函数作为参数引用的trained_images参数。这样做的问题是std::thread对象无法真正处理引用(它复制线程函数的参数,并且无法复制引用)。 / p>

解决方案是使用诸如std::ref之类的包装器对象作为参考:

t[thread_nbr] = std::thread(worker_routine, &context, std::ref(trained_images));