我正在阅读有关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;
}
我不懂
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);
}
谢谢。
最佳答案
让我们确切地了解正在发生的事情:
std::thread threads[5];
这将创建5个
std::thread
对象的数组,这些对象是默认构造的。当前,它们表示“不是线程”,因为这是默认构造保留它们的状态。for (int i = 0; i < 5; i++) {
threads[i] = std::thread(thread_task, i + 1);
}
这使用
operator=
的移动形式。因为线程不可复制,所以只能定义可移动的thread& operator=(thread&& t)
,而不能定义thread& operator=(const thread& t)
。这会将threads[i]
中的线程对象分配给新构造的std::thread(thread_task, i + 1);
。这里没有理由使用指针数组。它只会增加内存泄漏的可能性。
关于c++ - 无法理解std::thread的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18673073/