如你所知,多线程开发是软件开发的重要技术手段之一。其简化了并行编程的难度,具有极大提升 CPU 利用率,提升程序处理数据的能力等众多优点。但是相比单线程编程有一定的编程难度和门槛。在目前绝大多数软性系统中几乎是必不可少的技术,同时也是面试中的常客。

C++11的 std::thread 存在的问题

看下面一段代码,使用 std::thread 启动了一个线程。子线程的作用单纯就是睡眠两秒。

#include <chrono>
#include <thread>

int main() {
    std::thread th([] { 
        std::this_thread::sleep_for(std::chrono::seconds(2)); 
    });
}

有经验的朋友很容易判断处理,这里的主线程会首先结束,但是子线程还在运行。在默认情况下,两个线程都会继续往下运行。

在 gcc-MinGW-W64 下会在运行后报如下异常。

terminate called without an active exception

如何避免这种问题,答案是 使用 join() 或 detach()

  • join:等待线程完成其执行;
  • detach:容许线程从线程句柄独立开来执行。

其中使用 detach() 直接将线程独立出来后就难以对线程进行实际的把控,因此最常用的就是 join()。

#include <chrono>
#include <thread>

int main() {
    std::thread th([] { 
        std::this_thread::sleep_for(std::chrono::seconds(2)); 
    });
    
    th.join();
}

更多推荐