1.std::thread的用法
头文件为:
#include <thread>
2.例子
#include <thread>
#include <iostream>
#include <unistd.h>
using namespace std;
void thread_fun1(int val)
{
cout << "Thread::val="<<val<<endl;
}
class Task
{
public:
void Task_fun(int val)
{
cout << "Task::val="<<val<<endl;
}
};
int main()
{
int i = 1;
Task task;
Task bind_task;
//1.直接使用函数
std::thread thread1(thread_fun1,i);
usleep(100);
//2.使用类成员函数
std::thread thread2(&Task::Task_fun,&task,i);
usleep(100);
//3.使用std::bind
std::thread thread3(std::bind(&Task::Task_fun, &bind_task, 2));
usleep(100);
//4.使用lambda表达式
std::thread thread4([](){
cout << "called lambda thread" <<endl;
});
usleep(100);
thread1.join();//等待子线程结束
thread2.join();
thread3.join();
thread4.join();
return 0;
}
结果:
Thread::val=1
Task::val=1
Task::val=2
called lambda thread
3. std::join和std::detach
std::thread在栈中创建之后处于joinable状态,必须需要调用join或者 detach函数来使线程处于非joinable状态,原因为下图,当同一作用域下退出时,调用thread的析构函数,如果线程处于joinable状态,会调用std::terminate()
用来终止进程的调用
join()//阻塞等待子线程结束
detach()//脱离父线程,父子线程同时运行