c++ - 我可以将每次移动引用的数组传递给 std::thread 吗?

标签 c++ multithreading c++11 stl reference

我想做这样的事情:

void
Bah::f (std::vector <int> && array)
{
   std::thread (&Bah::foo, this, std::move (array)) .detach ();
}

void
Bah::foo (const std::vector <int> & array)
{
  do something with array
}

问题是:我可以将数组(变量)传递给 std::thread 的每个移动引用,然后在线程函数中作为 const 引用访问吗?调用线程函数前是否移动了数组?

我想要实现的是,我希望数组在调用 »f« 后为空。当调用 »foo« 时,我不需要数组的拷贝。

最佳答案

是的,你可以用这种方式在 vector 中移动。请参阅下面的一个小示例,说明移动(实际上将发生 4 次移动以将参数传递给线程)。

一个额外的评论:你不应该依赖移动使 vector 为空的事实。如果您需要在调用 f 后 vector 为空,您应该明确地对其调用 clear。在实践中, vector 可能为空,但未指定,标准允许它处于任何“有效”状态。

#include <thread>
#include <iostream>

using namespace std;

class A
{
public:
    A(){};
    A(const A&) { cout << "copy A" << endl; }
    A(A&&) { cout << "move A" << endl; }
};

class B
{
public:
    void bar() 
    { 
        A a;
        thread(&B::foo, this, move(a)).detach(); 
    }
    void foo(const A&) { return; }
};

int main()
{
    B b;
    b.bar();
}

// Output:
// move A
// move A
// move A
// move A

关于c++ - 我可以将每次移动引用的数组传递给 std::thread 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27371475/

相关文章:

c++ - 如何修复 C++ 中的随机字符输出?

c++ - 模板化类的模板化成员函数

c++ - recvfrom() 不返回接收到的字节数

java - 在 RXJava android 中为线程设置名称

iphone - 使用 XCode for iPhone 实现多线程

c++ - 有没有用 C++11 中基于范围的 for 循环替换 BOOST_FOREACH 的经验?

c++ - 你能初始化 unique_ptr 的 "static const vectors"吗? (C++17 与 GCC 7.3)

c++ - volatile 成员函数的性能后果

c++ - 为 iOS 4.x 使用 Boost 和 C++0x 方言

c++ - 隐式默认可构造的含义?