文章

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 进行授权