无法理解std :: thread的用法

lul*_*yon 1 c++ c++11 stdthread

我正在阅读有关c ++ 11多线程的文档,并且遇到了这个例子std::thread.

码:

void thread_task(int n) {
  ...
}

int main(int argc, const char *argv[])
{
    std::thread threads[5];
    for (int i = 0; i < 5; i++) {
        threads[i] = std::thread(thread_task, i + 1);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不明白threads[i] = std::thread(thread_task, i + 1);.是std::thread一个静态函数调用,并返回std :: thread对象的引用?听起来不可思议,但似乎是代码所说的.

因为我会这样写:

std::thread *threads[5];
for (int i = 0; i < 5; i++) {
    threads[i] = new std::thread(thread_task, i + 1);
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Yuu*_*shi 13

让我们来看看到底发生了什么:

std::thread threads[5];
Run Code Online (Sandbox Code Playgroud)

这将创建一个std::thread包含默认构造的5个对象的数组.目前它们代表"不是线程",因为这是状态默认构造离开它们.

for (int i = 0; i < 5; i++) {
    threads[i] = std::thread(thread_task, i + 1);
}
Run Code Online (Sandbox Code Playgroud)

这使用了移动形式operator=.因为线程不可复制,所以只thread& operator=(thread&& t)定义了可移动的线程,而thread& operator=(const thread& t)不是.这将线程对象分配给threads[i]新构造的std::thread(thread_task, i + 1);.

这里没有理由使用指针数组.它只会增加内存泄漏的可能性.