我正在阅读有关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/

10-15 04:51