在C++11中,"不代表执行线程"的线程有什么意义?
In C++11, what is the point of a thread which "does not represent a thread of execution"?
查看c++ 11中新的线程功能,看看它如何容易地映射到pthreads,我注意到thread
构造函数区域中奇怪的部分:
线程();
Effects:构造一个不代表执行线程的线程对象。
后置条件: get_id() == id()
抛出:。
换句话说,线程的默认构造函数实际上似乎并没有创建线程。显然,它创建了一个线程对象,,但是如果没有支持它的代码,它到底有什么用呢?是否有其他方式可以将"执行线程"附加到该对象上,如thrd.start()
或类似的东西?
是否有其他方式可以将"执行线程"附加到该对象,如thread .start()或类似的东西?
// deferred start
std::thread thread;
// ...
// let's start now
thread = std::thread(functor, arg0, arg1);
std::thread
是一个MoveConstructible和MoveAssignable类型。因此,这意味着在std::thread zombie(some_functor); std::thread steal(std::move(zombie));
这样的代码中,zombie
将留在一个特殊的,但有效的状态,与没有执行线程相关联。从某种意义上说,默认构造函数是免费的,因为它所要做的就是将对象置于该状态。它还允许std::thread
的数组和std::vector<std::thread>::resize
的操作。
它的意思与以下相同:
std::vector<int> emptyList;
emptyList
为空。就像默认构造的std::thread
一样。就像默认构造的std::ofstream
不会打开文件一样。有完全合理的理由让类默认将自己构造为空状态。
如果你有一个空线程:
std::thread myThread;
你可以这样启动线程:
myThread = std::thread(f, ...);
其中f
是一些可调用的东西(函数指针、函子、std::function
等),...
是要转发给线程的参数
不只是猜测:
"线程对象"指的是一个std::thread
。
"执行线程"指的是操作系统中代表一个线程的硬件寄存器的集合。
c++ 11只是将操作系统的API用于访问操作系统线程,以使c++线程可移植到所有操作系统。
线程();
Effects:构造一个不代表执行线程的线程对象。
后置条件: get_id() == id()
抛出:。
这意味着默认构造的std::thread
不指向操作系统产生的执行线程。
std::thread
可以被赋一个新值,然后通过move赋值语句开始指向一个正在执行的OS线程:
std::thread t; // Does not refer to an OS thread
//...
t = std::thread(my_func); // t refers to the OS thread executing my_func
只是猜测,但这仅仅意味着线程没有启动。换句话说,它只是一个像其他对象一样的对象——它背后不一定有一个实际的操作系统线程。换句话说,如果线程是在pthread之上实现的,那么创建一个c++ 11线程对象并不一定需要调用pthread_create()——这只需要在线程启动时发生。
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 是什么导致了Unity 3D中的"错误线程异常"?
- 我的C++线程做错了什么?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 正在连接的等待条件变量的线程会发生什么情况?
- 线程和互斥锁的使用有什么问题
- 等待线程的最佳方式是什么
- 调用boost.asio的异步函数时,线程是什么时候创建的
- 什么是运行英特尔线程构建模块的 XCode 8 环境变量
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- 什么时候标准::线程::连接会因no_such_process而失败
- 当两个线程同时尝试在同一静音上尝试try_lock()时会发生什么
- 什么时候使用互斥锁的吸气剂和二传手是线程安全的?
- 在Qt中使用工作线程将数据写入文件的正确方法是什么?
- 什么保证两个不相关的线程中的不同不相关对象没有(不可避免的)争用条件?
- gdb 中的线程 0x7fffc57fa700 (LWP 31671) 退出] 是什么意思?
- 如果我将作品张贴到线程池,并且线程已经在Boost中工作,会发生什么
- 停止线程的方法是什么(当我直接从Qthread继承时)
- QTimer对象是否在单独的线程中运行?它的机制是什么
- 什么是线程锁返回代码值