std::线程的矢量
vector of std::threads
C++11
我正在尝试制作std::thread
s的vector
。以下三点的结合表明我可以。
1.(根据http://en.cppreference.com/w/cpp/thread/thread/thread,thread
的默认构造函数创建一个
不表示线程的线程对象。
2.(根据http://en.cppreference.com/w/cpp/thread/thread/operator%3D,thread
的operator=
指定[参数的状态是使用move对[调用线程]的线程右值引用语义。
3.(根据http://en.cppreference.com/w/cpp/container/vector/vector,通过只有向量构造函数的大小类型变量才能构造
初始化了[指定数量]值的容器(默认构造,用于类(的实例。不进行复制。
所以,我这样做了:
#include <iostream>
#include <thread>
#include <vector>
void foo()
{
std::cout << "Hellon";
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
然后我在clang 3.2中尝试了一下,在同一网页上切换编译器菜单,得到:
stderr:
pure virtual method called
terminate called without an active exception
当表示线程的线程对象在join()
ed或detach()
ed之前超出作用域时,程序将被迫终止。我有join()
和vecThread.at(0)
,所以唯一有问题的是临时线程
std::thread(foo);
在中
vecThread.at(0) = std::thread(foo);
任务。
但是,根据web引用,只能通过移动线程值引用来分配线程。我想不出任何方法可以将join()
或detach()
作为临时线程对象。
那么,如果clang的输出是正确的,那么thread
的operator=
有什么用呢?或者这是一个clang编译器错误?
在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::thread"将使用显式构造函数的std::thread::thread(_Callable&&;,_Args&&;…([with_Callable=void(&(((;_Args={}]'vecThread.at(0(={foo};
这太先进了——我不知道这意味着什么。
在clang中做出同样的改变使更加先进:
clang 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}
问题,因为自2012年11月起,VC11的CTP编译器不支持标准库上的统一初始化语法。
您的第一个示例是正确的。当您将clang与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
附言:请看这里,为什么也需要标志-lsupc++
。
- 为什么std::async使用同一个线程运行函数
- 在std::thread中,joinable()然后join()线程安全吗
- 在main()之外初始化std::vector会导致性能下降(多线程)
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 使用 std::string () const 函数启动线程或未来
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 即发即弃 std::线程对象清理自身
- std::mutex 如何防止线程修改?
- std::线程导致程序中止
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- std::cout 来自多个线程
- 简单使用 std::atomic 在两个线程之间共享数据
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 线程 std::调用未知类型,无法专门化函数错误
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- 带有 std::cout 的多线程控制台文本动画
- 线程不是 std c++ 的成员
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 使用 std::condition_variable 触发其他线程.使用哪些互斥锁?
- 使用多线程(std::async、std::thread或?)加速