在异步调用中将 shared_ptr 作为参数传递
Passing shared_ptr as parameter in async call
我正在将我的代码转换为多线程以提高性能。
我有 shared_ptr 的向量和另一个 class 的对象,我正在将向量中的 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
}
你能帮帮我吗?谢谢
I am converting my code to multi thread to performance enhancement.
我们开始吧...我预测困难。
该错误告诉您使用 std::async
将传递给它的参数调用 foo1
的结果未定义,即您不能使用这些参数调用该函数。
原因是函数 foo1
接受类型为 B&
的参数,但 std::async
复制其参数并将 副本 转发给目标函数,因此它将复制 b
然后调用 foo1
并将该副本作为右值转发,不能绑定到 B&
.[=25 类型的左值引用=]
如果你真的想通过引用传递 b
那么你需要包装它:
std::async(std::launch::async, foo1, a, std::ref(b))
但是你应该小心,看起来每个线程都会有一个对同一个 B
对象的非常量引用,这意味着它们可能正在同时修改该对象,这将导致数据竞争(和未定义的行为)除非 B
已经是线程安全的,或者您修改函数 foo1
以同步对 B
.
的访问
如果代码在多线程中使用不安全,那么仅仅在您的代码上撒上多线程仙尘不会使它变得更快。
我正在将我的代码转换为多线程以提高性能。
我有 shared_ptr 的向量和另一个 class 的对象,我正在将向量中的 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
}
你能帮帮我吗?谢谢
I am converting my code to multi thread to performance enhancement.
我们开始吧...我预测困难。
该错误告诉您使用 std::async
将传递给它的参数调用 foo1
的结果未定义,即您不能使用这些参数调用该函数。
原因是函数 foo1
接受类型为 B&
的参数,但 std::async
复制其参数并将 副本 转发给目标函数,因此它将复制 b
然后调用 foo1
并将该副本作为右值转发,不能绑定到 B&
.[=25 类型的左值引用=]
如果你真的想通过引用传递 b
那么你需要包装它:
std::async(std::launch::async, foo1, a, std::ref(b))
但是你应该小心,看起来每个线程都会有一个对同一个 B
对象的非常量引用,这意味着它们可能正在同时修改该对象,这将导致数据竞争(和未定义的行为)除非 B
已经是线程安全的,或者您修改函数 foo1
以同步对 B
.
如果代码在多线程中使用不安全,那么仅仅在您的代码上撒上多线程仙尘不会使它变得更快。