我正在将我的代码转换为多线程到性能增强。
我有shared_ptr的向量和另一个类的对象,我从vector传递一个shared_ptr,并将一个对象作为参数传递给函数。 我使用std :: async调用它,但它给了我以下错误:
line from where I am making async call : required from here
/usr/include/c++/4.8.2/functional1697.61: error: no type named 'type'
in 'class std::result_of<void (*(std::shared_ptr<A>, B))
(const std::shared_ptr<A>&, B&)>'typedef typename
result_of<_Callable(_Args...)>::type result_type;
以下是代码段:
void foo(std::vector<std::shared_ptr<A>>& a, B b){
std::vector<std::future<void>> tasks;
for(auto& sptr : a ){
tasks.push_back(std::async(std::launch::async, foo1, a, b))
}
void foo1(const std::shared_ptr<A>& a, B& b ){
//do some stuff
}
你能帮我吗?谢谢
答案 0 :(得分:5)
我正在将我的代码转换为多线程到性能增强。
我们走了......我预测会遇到困难。
错误告诉您调用foo1
的结果std::async
将传递给它的结果未定义,即您无法使用这些参数调用该函数。
原因是函数foo1
采用B&
类型的参数,但std::async
复制其参数并将副本转发到目标函数,因此它将复制b
,然后调用foo1
并将该副本作为右值转发,该值不能绑定到B&
类型的左值引用。
如果您确实希望通过引用传递b
,那么您需要将其包装起来:
std::async(std::launch::async, foo1, a, std::ref(b))
但是你应该小心,看起来每个线程都会对同一个B
对象进行非const引用,这意味着它们可能会同时修改该对象,这将导致数据争用(和未定义的行为)除非B
已经是线程安全的,否则您修改函数foo1
以同步对B
的访问。
如果在多个线程中使用代码不安全,只需在代码上撒上多线程的小精灵灰尘就不会让它变得更快。