线程创建
使用std::thread创建线程,只需要提供函数或者仿函数即可,std::thread使用了可变参数模板,可以传递任意个参数函数参数,但是函数的返回值会被忽略
示例:
#include <iostream>
#include <thread>
class A
{
int m_a;
};
int test(A param)
{
return 0;
}
int main()
{
//创建线程,并向test函数传递参数
std::thread thread1(test,A());
//使用lambda表达式作为线程执行函数
std::thread thread2([](int tmp)
{
printf("lambda\n"); },
10);
//使用std::function作为线程执行函数
std::thread thread3(std::bind(&test,A()));
thread1.join();
return 0;
}
注意事项:使用这种方式创建线程非常方便,但std::thread变量出了作用域会被析构,若此时线程还未执行完将产生错误,在使用时注意控制好std::thread变量的生命周期。
std::thread不能复制,只能移动类似于std::unique_ptr,所以我们可以先创建线程,再将其移动到其他容器中
示例:
#include <iostream>
#include <thread>
#include <list>
#include <functional>
class A
{
int m_a;
};
std::list<std::thread> L;
void func()
{
for (int i = 1; i <= 10; i++)
{
std::thread t([](A param)
{
printf("lambda\n");
},A());
L.push_back(std::move(t));
}
}
int main()
{
func();
for(auto &it : L)
{
it.join();
}
return 0;
}
线程基本用法
1.获取线程ID
int main()
{
std::thread t(func);
//获取线程id
t.get_id();
return 0;
}
2.获取CPU核心数,我们可以根据CPU核心数来设置线程池中的线程数
int main()
{
std::cout << std::thread::hardware_concurrency();
return 0;
}
3.线程休眠,我们可以使用std::this_thread::sleep_for()让线程休眠,从而替代操作系统原生的sleep,方便跨平台
int main()
{
//使主线程休眠3s
std::this_thread::sleep_for(std