目录
网上说的不清不楚的,自己写一篇。
并发,就是几个任务同时进行。单核 CPU 的“并发”是假的,只是任务快速切换给人感觉像并行,实际是串行。多核 CPU 才会真正并行。当然,任务数 > CPU 核数还是会有切换的情况,比如 windows 上的任务(线程)都是上千个。
一个可执行程序执行起来就是一个进程,一个进程只能有一个主线程。线程也不是越多越好,每个线程需要独立的堆栈空间,线程切换也要保存很多中间状态。
如何实现并发?多进程或多线程。但优先使用多线程,因为一个进程中所有线程共享地址空间,还有诸如全局变量、指针、引用都可以在线程间传递,开销远小于多进程。
线程创建直接使用 thread 库:
thread thread1(fun1);
这样会创建名字叫 thread1 的线程,调用函数 fun1(),注意,立即执行。 不像 java 里还要 start() 哦!
join() 和 detach() 的区别见下面代码注释,不赘述。
- #include
- #include
-
- using namespace std;
-
- void fun1()
- {
- cout << "开始执行fun1()" << endl;
- }
-
- void fun2(int x)
- {
- cout << "开始执行fun2(), " << "x=" << x << endl;
- }
-
-
- int main() {
- cout << "主线程已经开始" << endl;
-
- // 创建线程,会立即执行
- thread thread1(fun1);
- thread thread2(fun2, 666);
-
- thread1.join(); // join() 代表汇合,阻塞的作用,主线程在这里等待子线程执行完毕
- thread2.join();
-
- // 如果使用detach(),则主线程与子线程分离,主线程不会等待子线程
- // 使用detach()主线程执行完了return 0, 程序终止子线程也没了,因此join()阻塞的方式更常用
- // thread1.detach();
-
- cout << "主线程马上结束" << endl;
- return 0;
- }
上述代码执行结果:
- 主线程已经开始
- 开始执行fun1()
- 开始执行fun2(), x=666
- 主线程马上结束
thread1 是否一定比 thread2 先执行完毕,不一定。thread1 是比 thread2 先启动,但两者是并行执行的,理解这个就理解了多线程核心。
不写 join() 可不可以,不可以。那样可能主线程执行完了,子线程还没执行完,但是由于进程退出,子线程也中途停止了。
还有一个 joinable() 函数也有一定作用,可以判断你是否调用过 join() 或者 detach()。
工作太紧张,未完待续...