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);.
这里没有理由使用指针数组.它只会增加内存泄漏的可能性.