06.C++线程
06.C++线程
C++ 线程基础
C++ 线程入门
- 使用多线程,首先要添加头文件
#include <thread>
。 - 在Linux 平台下编译时需要加上 “-lpthread” 链接库
- 创建一个线程对象:
std::thread objName (一个函数指针以及其他可选的任何参数)
- 等待一个线程完成它的工作的方法 :
worker.join()
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//这个代码案例相当无用,只是为了展示多线程的工作而展示的。
#include <iostream>
#include <thread>
void DoWork() {
std::cout << "hello" << std::endl;
}
int main() {
//DoWork即是我们想要在另一个执行线程中发生的事情
std::thread worker(DoWork); //这里传入的是函数指针,函数作为形参都是传函数指针。
//一旦写完这段代码,它就会立即启动那个线程,一直运行直到我们等待他退出
worker.join(); //join函数本质上,是要等待这个线程加入进来(而线程加入又是另一个复杂的话题了)
//因为cin.get()是join语句的下一行代码,所以它不会运行,直到DoWork函数中的所有内容完成!
std::cin.get();
}
#include <iostream>
#include <thread>
static bool is_Finished = false;
void DoWork() {
using namespace std::literals::chrono_literals; //等待时间的操作可以先using一个命名空间,为 1s 提供作用域
while (is_Finished) {
std::cout << "hello" << std::endl;
std::this_thread::sleep_for(1s); //等待一秒
}
}
int main() {
std::thread worker(DoWork); //开启多线程操作
std::cin.get(); //此时工作线程在疯狂循环打印,而主线程此时被cin.get()阻塞
is_Finished = true;// 让worker线程终止的条件,如果按下回车,则会修改该值,间接影响到另一个线程的工作。
worker.join(); //join:等待工作线程结束后,才会执行接下来的操作
std::cin.get();
}
如果是正常情况,DoWork
应该会一直循环下去,但因为这里是多线程,所以可以在另一个线程中修改工作线程的变量,来停止该线程的循环。 多线程对于加速程序是十分有用的,线程的主要目的就是优化。
本文由作者按照 CC BY 4.0 进行授权