进程和线程
进程是资源调度的最小单位
线程是操作系统能够进行运算调度的最小单位
头文件:#include<thread>
void func()
{
cout << "func" << endl;
}
int main()
{
std::thread tha(func);//创建一个线程
tha.join();//等待线程结束
}
线程的状态:
创建-->就绪-->执行-->io阻塞-->就绪-->...
每个线程对应一个线程结构+内核栈(10M),可能在执行过程中被其他线程打乱。
同步&异步
同步:任务在执行时必须按照一定的顺序进行,当前任务执行完成之后才能执行下一个任务。
异步:任务在执行时不需要按照固定的顺序进行,可以同时执行多个任务,每个任务的执行结果也不一定按照执行顺序返回。
在编程中,同步和异步通常指的是函数调用的方式。同步函数调用会阻塞当前线程直到函数执行完成并返回结果,而异步函数调用则不会阻塞当前线程,而是在后台启动一个任务去执行函数,并在函数执行完成后再通知主线程获取结果。常见的异步编程方式有回调函数、Promise、async/await等。
注意
两个线程不共享数据,x、y分别有两份,在线程对应的内核栈中
void func()
{
int x = 10;
int y = 20;
}
int main()
{
cout << "main begin" << endl;
std::thread tha(func);
std::thread thb(func);
tha.join();
thb.join();
cout << "main end" << endl;
}
thread(func,'a');//func是创建线程的函数,a是func中需要的参数
输出顺序不一定:暂时存在缓存中
线程函数不要有返回值!!!无法获取线程函数的返回值
函数重载时放入线程中无法区分:error
void fun(){}
void fun(int a){}
void fun(int a,char*p){}
int main()
{
char c = 'ch';
int a = 10;
thread::tha(fun);
thread::thb(fun,a);
thread::thc(fun,&c);
}
不能用拷贝构造或赋值=,可以用移动构造和移动赋值;
一些方法
线程函数的形参若为引用需要加上ref
void funa(int&p,int a){}
int main()
{
int p = 100;
thread tha(funa,std::ref(p),10);
}
hardware_concurrency:返回逻辑内核数量
join:等待线程执行完毕,关联线程与当前进程,释放资源
detach分离:把线程从当前进程剥离出去,进程执行完毕线程就没有机会执行了
std::this_thread::sleep_for(std::chrono::milliseconds(10)):线程的执行停止指定的时间段
std::this_thread::sleep_until():线程的执行停止到指定的时间点
get_id:返回线程的id号
joinable:检查现有的线程是1否0结束