两个或者多个任务同时发生,一个程序同时执行多个独立任务
进程一个可执行程序运行起来了,就创建一个进程
线程每个进程,都有一个主线程,并且主线程是唯一的,也就是一个进程只有一个主线程。
当你执行一个可执行程序,产生一个进程后,这个主线程就随着一个进程启动起来了。
F5运行的时候,进程的主线程来调用main函数的代码
线程,代码的执行通路。
除了主线程外,可以通过自己写代码来创建其他线程,其他线程是走别的地方
每创建一个新的线程,就可以在同一时刻,多干一个不同的事情
线程并不是越多越好,每个线程,就需要一个独立的堆栈空间,线程之间切换要保存很多中间状态
并发的实现方法
1)多个进程实现并发
2)在单独进程中,创建多个线程来实现并发,自己写代码来创建除了主线程之外的其他线程
相同电脑进程之间通信(管道,文件,消息队列,共享内存)
不同电脑:Socket通信技术
多线程并发
单个进程中创建多个线程
每个线程都有自己独立的运行路径,但是一个进程中多个线程都是共享地址空间(内存的)
全局变量,指针,引用都可以在线程中传递,所以使用多线程开销远远小于多进程
线程启动更快,更轻量级
系统资源开销更少,执行更快,共享内存比其他任何通信方式都快
缺点是使用难度高,小心处理数据一致性
写线程
包含头文件thread
void myprint() { cout << "1111" << endl; cout << "2222" << endl; } int main() { thread mythe(myprint);//创建了线程,线程执行的入口,myprint(),这个myprint线程开始执行 mythe.join();//加入汇合,阻塞主线程,让主线程等待子线程执行完毕,然后两个汇合。主线程往下走 cout << "end" << endl; return 0; }Detach()
传统多线程主线程要等待至子线程执行完毕,然后自己最后退出
分离:主线程不与子线程汇合,各自执行,互不影响。
创建了多个子线程,让主线程逐个等待子线程结束。但是这个方法并不太好,应该逐个等待。
这个子线程相当于被c++运行时刻接管,当这个子线程执行完后,由运行时库清理相关资源。
一旦用detach 不能join
joinable()
如果能join或者detach
类对象(可调用对象)创建线程
class TA { public: void operator()() { cout << "111" << endl; cout << "2222" << endl; } }; int main() { TA tt; thread mythe(tt);//创建了线程,线程执行的入口,myprint(),这个myprint线程开始执行 mythe.join();//加入汇合,阻塞主线程,让主线程等待子线程执行完毕,然后两个汇合。主线程往下走 cout << "end" << endl; return 0; }
传递临时对象作为线程参数
指针传递在detach中一定会有问题,因为地址是一致的,不知何时线程会销毁这个变量。
char[] 传递时,可以用string &str 来接收
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)