1、C++多线程介绍
thread(线程类)
mutex(互斥锁)
condition_variable(线程间的通信,条件变量)
智能锁:(自动的加锁解锁)
lock_guard
unique_lock
atomic 原子类型 基于CAS操作的原子类型 线程安全的
sleep_for(睡眠)
C++语言层面 thread(底层用的还是下面平台的方法)
windows linux strace ./a.out(程序启动的跟踪打印的命令)
| |
createThread pthread_create
- 可以通过编译器的编译,加个宏,识别当前的操作系统来适配通过语言层面编写thread底层自动调用相应的函数。
- 底层还是调用系统创建的API,只是语言层面加个封装,让用户更加方便使用。
2、多线程编程
线程内容:
-
1、怎么创建启动一个线程?
std::thread定义一个线程对象,传入线程所需要的线程函数和参数,
线程自动开启 -
2、子线程如何结束
子线程函数运行完成,线程就结束了 -
3、主线程如何处理子线程
t.join() : 等待t线程结束,当前线程继续往下运行
t.detach() : 把t线程设置为分离线程,主线程结束,整个进程结束,所有子线程都自动结束了!
测试结果: -
join(): 主线程会等待子线程运行结束,才继续执行
-
hello thread1会永远运行在main thread之前的,因为主线程join了,在等待子线程。
子线程睡眠:
this_thread(): 是一个namespace,里面有一些方法;
- get_id():获取线程id;
- yield():放弃当前线程这一轮的时间片
- sleep_for():睡眠多长时间
- sleep_until():睡到哪一个时间点
std::chrono():定义了一些和时间相关的常量。
线程函数中可以传入多个参数:
问题:
两种解决方法:
- t.join(): 主线程等待子线程t运行完,主线程继续向下执行;
- t.detach():将子线程t设置为分离线程,就和主线程没有关系了 ,主线程结束,所有子线程都自动结束了;
#include <iostream>
#include <thread>
using namespace std;
void threadHandle1(int time)
{
//让子线程睡眠time秒
std::this_thread::sleep_for(std::chrono::seconds(time));
cout << "hello thread1!" << endl;
}
void threadHandle2(int time)
{
//让子线程睡眠time秒ace this_thread是namespace
std::this_thread::sleep_for(std::chrono::seconds(time));
cout << "hello thread2!" << endl;
}
int main()
{
//创建了一个线程对象,传入一个线程函数(作为线程入口函数),
//新线程就开始运行了,没有先后顺序,随着CPU的调度算法执行
std::thread t1(threadHandle1, 2);
std::thread t2(threadHandle2, 3);
//主线程(main)运行到这里,等待子线程结束,主线程才继续往下运行
t1.join();
t2.join();
//把子线程设置为分离线程,子线程和主线程就毫无关系了
//主线程结束的时候查看其他线程
//但是这个子线程运行完还是没运行完都和这个主线程没关系了
//这个子线程就从这个main分离出去了
//运行程序时也看不到这个子线程的任何输出打印了
//t1.detach();
cout << "main thread done!" << endl;
//主线程运行完成,查看如果当前进程还有未运行完成的子线程
//进程就会异常终止
return 0;
}