线程允许多个程序任务在统一时间执行,不同的线程可以共享内存空间,每个线程也有自己的栈空间。
本文章的代码库:
https://gitee.com/gamestorm577
线程类
thread
类thread表示单个执行线程。线程在thread构造对象时开始执行。每个thread对象表示唯一的一个线程,thread不支持复制构造和复制赋值函数。
构造函数
默认的构造函数构造一个不表示任何线程的thread对象:
thread() noexcept;
构造函数可以传入一个函数并关联一个执行线程,构造完成后函数将在该线程上开始运行:
template< class F, class... Args >
explicit thread( F&& f, Args&&... args );
代码示例:
auto func = [](int index)
{
for (int i = 0; i < 15; ++i)
{
std::cout << index;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
};
std::thread t1(func, 1);
std::thread t2(func, 2);
t1.join();
t2.join();
std::cout << std::endl;
t1和t2分别在两个线程上同时执行,打印出来的1和2可能是交错的,可能的输出结果:
122121121212121212212121212121
析构函数
销毁thread对象时,必须合并或者分离底层线程,否则会调用std::terminate导致程序崩溃。其内部实现大致为:
~thread() noexcept
{
if (joinable())
{
terminate();
}
}
赋值函数
thread只支持移动赋值函数,移动后线程的所有权被转交,原thread对象不再表示任何线程。
joinable
检查线程是否可合并,如果thread代表的线程是活跃的,那么joinable返回true。代码示例:
std::cout << std::boolalpha;
std::thread t;
std::cout << "t joinable: " <<