的std ::线程矢量(vector of std::threads)

2019-07-21 18:35发布

C ++ 11

我试图做一个vectorstd::thread秒。 以下三点的结合,说我可以。

1)根据http://en.cppreference.com/w/cpp/thread/thread/thread , thread的默认构造函数创建一个

线程对象不表示一个线程。

2.)根据http://en.cppreference.com/w/cpp/thread/thread/operator%3D , threadoperator=

分配[参数,这是一种螺纹右值参考]的状态,以使用移动语义[调用线程]。

3.)根据http://en.cppreference.com/w/cpp/container/vector/vector ,仅通过一个尺寸类型变量为矢量构造器将构造

与容器[指定数目的]值初始化(默认构造,班)T.无拷贝的实例制成。

所以,我这样做:

#include <iostream>
#include <thread>
#include <vector>

void foo()
{
    std::cout << "Hello\n";
    return;
}

int main()
{
    std::vector<std::thread> vecThread(1);
    vecThread.at(0) = std::thread(foo);
    vecThread.at(0).join();
    return 0;
}

这运行正常的VC11和G ++ 4.8.0(在线编译这里)所看到如下所示:

控制台输出:

Hello

然后我试图在铛3.2,通过切换同一网页,这使编译器菜单:

stderr: 
pure virtual method called
terminate called without an active exception

当一个线程对象表示一个线程超出范围是前join() ED或detach()编,该程序将被强制终止。 我join()vecThread.at(0)所以留在问题的唯一的事情是临时线程

std::thread(foo);

在里面

vecThread.at(0) = std::thread(foo);

分配。

然而,根据网络参考,线程只能通过移动螺纹右值引用指派。 我想不出任何方式join()detach()临时线程对象。

所以,如果铛的输出是正确的,那么有什么用的threadoperator= ? 或者,这是一个铿锵编译器错误?

以g ++ 4.8.0,改变线

vecThread.at(0) = std::thread(foo)

vecThread.at(0) = std::thread{foo}

(用大括号替换括号中)仍给出了预期Hello输出。

然而,改变线vecThread.at(0) = {foo}使得它抱怨:

G ++ 4.8.0对大括号投诉:

错误:从初始化列表转换成 '的std ::线程' 将使用显式构造“的std ::螺纹::线程(_Callable &&,_args && ......)与_Callable =无效()(); _args = {}]” vecThread.at(0)= {FOO};

这是太先进了,我不知道这意味着什么。

使在铛相同的变化给出了更先进:

铛3.2对大括号投诉:

error: no viable overloaded '='
vecThread.at(0) = {foo};
...
note: candidate function not viable: cannot convert initializer list
argument to 'const std::thread'
thread& operator=(const thread&) = delete;
...
note: candidate function not viable: cannot convert initializer list
argument to 'std::thread'
thread& operator=(thread&& __t) noexcept

我不知道这意味着什么无论是。

我不能用VC11以证实上述

vecThread.at(0) = {foo}

问题,因为VC11,为2012年11月CTP编译器,不支持标准库的统一初始化语法。

Answer 1:

你的第一个例子是正确的。 抛出异常是一个已知的bug ,当你使用铛用的libstdc ++。 为了解决这个问题,你必须安装的libc ++(C ++库的LLVM版本)。 看到的libc编译的一个例子下面++

#include <thread>

int main()
{
    std::thread t([] () {});
    t.join();
    return 0;
}

$ clang++ -std=c++11 -stdlib=libc++ main.cpp -o main -lc++ -lsupc++ -lpthread

PS见这里 ,为什么旗-lsupc++太需要。



文章来源: vector of std::threads