TypechoJoeTheme

鱼一的博客 ◡̈

yuyi

知不可乎骤得,托遗响于悲风
网站页面
标签搜索
c++

线程基本知识

在C++中,线程的创建和销毁是通过C++11标准引入的 <thread> 库实现的,这使得处理线程变得相对直观和安全。下面,我将为你介绍如何在C++中创建、使用和销毁线程。

创建线程

要创建一个线程,你需要包含头文件 <thread> 并创建一个 std::thread 对象。在创建时,可以传递一个函数或者可调用对象给线程,该函数或对象将作为新线程的入口点。这里是一个简单的例子:

#include <iostream>
#include <thread>

void function() {
    std::cout << "Thread is running." << std::endl;
}

int main() {
    std::thread t(function);  // 创建一个线程,线程开始执行 function
    t.join();  // 等待线程结束
    return 0;
}

在上面的例子中,我们创建了一个执行 function 的线程。function 只是简单地打印一条消息。

线程的销毁

销毁线程涉及确保线程在对象生命周期结束之前正确完成其任务。主要有两种方法来处理线程的结束:

  1. Joining:通过调用 join() 方法,你可以确保主线程(或创建线程的任何线程)等待由 std::thread 对象表示的线程完成执行。这是确保所有线程以安全方式结束的常用技术。
  2. Detaching:如果你不想等待线程完成,可以调用 detach() 方法,这会使线程在后台运行,独立于主线程。一旦线程被detach,它将继续执行直到任务完成,此时由操作系统清理其资源。使用 detach() 时需要谨慎,因为如果主程序结束,后台线程可能会突然中断。

示例:使用 Join

#include <iostream>
#include <thread>

void worker() {
    std::cout << "Working..." << std::endl;
}

int main() {
    std::thread t(worker);
    t.join();  // 确保t完成后主函数才继续执行
    std::cout << "Worker thread joined." << std::endl;
    return 0;
}

示例:使用 Detach

#include <iostream>
#include <thread>

void worker() {
    std::cout << "Working in background..." << std::endl;
}

int main() {
    std::thread t(worker);
    t.detach();  // 将t放到后台执行
    std::cout << "Main function continues..." << std::endl;
    // 假设主函数这里有足够的任务使得t可以完成其工作
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 暂停主线程确保后台线程有时间完成
    return 0;
}

注意事项

  • 当一个 std::thread 对象被销毁时(如离开其作用域),如果它仍然是 joinable(即没有被 joindetach),程序会终止(调用 std::terminate)。因此,始终确保在 std::thread 对象被销毁前,要么调用 join(),要么调用 detach()
  • 使用 detach() 时要特别注意资源管理和异常处理,以避免资源泄漏或未定义的行为。

使用 <thread> 库提供的工具,可以在C++中有效地管理线程的生命周期和并发任务。

赞(0)
版权属于:

鱼一的博客 ◡̈

本文链接:

https://yuyi.monster/archives/239/(转载时请注明本文出处及文章链接)

评论 (0)

More Info for me 📱

IP信息

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月