自c++11版本后,标准库也提供了对线程的支持。虽然大多场合还是使用其他的三方线程库,如:boost::thread, QThread等,但是学习下还是有必要的。
1. std::thread简介
std::thread类即创建子线程的类,定义于头文件thread中。
std::thread类仅不到十个公开成员函数,同时无法进行拷贝,只能使用移动构造和赋值转移所有权。
2. CPU支持的线程并发数
#include <thread>
[static]
unsigned int std::thread::hardware_concurrency();
// 返回硬件支持的线程数目,失败返回0
#include <iostream>
#include <thread>
int main()
{
std::cout << "CPU是" << std::thread::hardware_concurrency() << "线程" << std::endl;
return 0;
}
3. 创建子线程
#include <thread>
[public]
template<typename _Callable, typename... _Args>
std::thread::thread(_Callable&& __f, _Args&&... __args);
// 构造函数之一, 传一个可以调用的函数或者对象作为任务, 有子线程来处理运行这个任务。
// 未调用此构造函数的线程是无法执行的,称为空任务线程。
// 需要明确的是构造完成后,子线程即开始执行,而不是等join(结合)或者detach(分离)调用才执行
bool std::thread::joinable() const;
// 未被结合或者分离的非空任务线程会返回true, 否则返回false。
std::thread::id std::thread::get_id() const;
// 未被结合或者分离的非空任务线程会返回非0的整数作为子线程的标识符
#include <iostream>
#include <thread>
void func(int a)
{
std::cout << "This function is callable: " << a << std::endl;
}
class callable_obj
{
public: