C++11 Thread 线程库入门教程
C11 标准正式引入了thread线程库为原生 C 提供了跨平台的多线程编程能力。本文将从基础用法入手详细讲解如何利用该库创建、管理线程包括线程的启动、等待、分离等核心操作帮助开发者快速掌握 C 多线程编程的基础要点。线程的创建在 C11 中创建线程的核心是实例化std::thread对象该对象需要绑定一个可调用对象作为线程的执行入口 —— 可调用对象可以是普通函数、函数对象仿函数、Lambda 表达式等。基本语法格式#include thread // 实例化线程对象绑定执行函数和参数 std::thread 线程对象名(可调用对象, 参数列表...);创建线程后必须通过join()等待线程执行完成或通过detach()将线程分离至后台运行否则会触发未定义行为。基础示例创建简单线程输出文本#include iostream #include thread // 线程执行函数 void print_greeting() { std::cout Hello from new thread! std::endl; } int main() { // 创建线程并绑定执行函数 std::thread t(print_greeting); // 等待线程执行完毕 t.join(); return 0; }向线程传递参数线程函数支持接收参数传递方式分为值传递和引用传递两种需注意不同传递方式的语法细节值传递直接将参数传入std::thread构造函数参数会被拷贝到线程栈中引用传递必须使用std::ref()包装引用参数否则编译器会将引用视为值传递导致编译错误。示例代码#include iostream #include thread #include string // 值传递参数 void print_msg(const std::string msg) { std::cout Message: msg std::endl; } // 引用传递参数 void increase_num(int num) { num; } int main() { // 1. 值传递示例 std::string hello Hello Thread!; std::thread t1(print_msg, hello); t1.join(); // 2. 引用传递示例 int count 0; // 必须用std::ref包装引用否则编译失败 std::thread t2(increase_num, std::ref(count)); t2.join(); std::cout Count after increment: count std::endl; return 0; }等待线程执行完成joinjoin()方法会阻塞当前线程通常是主线程直到目标线程执行完毕。当需要确保线程执行结果被正确处理、资源被释放时必须调用该方法。多线程等待示例#include iostream #include thread #include string void print_thread_id(const std::string id) { std::cout Executing id std::endl; } int main() { // 创建两个并行线程 std::thread t1(print_thread_id, Thread 1); std::thread t2(print_thread_id, Thread 2); // 等待t1执行完成 t1.join(); // 等待t2执行完成 t2.join(); // 所有线程执行完毕后才会执行此行 std::cout All threads have finished execution std::endl; return 0; }分离线程detachdetach()方法会将线程与std::thread对象解耦让线程转入后台运行成为 守护线程主线程无需等待其完成。分离后的线程由操作系统接管执行完毕后自动释放资源。注意事项线程分离后无法再调用join()等待其完成需确保主线程不会过早退出否则可能导致分离线程被强制终止引发未定义行为。分离线程示例#include iostream #include thread #include string void background_task(const std::string task_name) { std::cout Background task [ task_name ] running... std::endl; } int main() { std::thread t(background_task, Task 1); // 分离线程使其在后台运行 t.detach(); std::cout Thread detached, main thread continues... std::endl; // 主线程短暂休眠确保分离线程有时间执行仅为演示 std::this_thread::sleep_for(std::chrono::milliseconds(100)); return 0; }joinable () 方法的使用joinable()是std::thread的成员方法返回布尔值true线程未被join()或detach()可执行等待 / 分离操作false线程已完成、已分离或线程对象为空无法执行等待 / 分离操作。若对非 joinable 的线程调用join()或detach()会抛出std::system_error异常因此建议在操作前先通过joinable()判断。示例代码#include iostream #include thread void simple_task() { std::cout Thread task started std::endl; } int main() { std::thread t(simple_task); // 先判断线程是否可操作再执行join if (t.joinable()) { t.join(); std::cout Thread joined successfully std::endl; } return 0; }常见错误与注意事项未处理线程状态创建线程后未调用join()或detach()主线程退出时会触发程序崩溃或未定义行为共享数据未同步多线程访问共享变量时未使用互斥锁std::mutex等同步机制会导致数据竞争、结果错乱异常未捕获线程内抛出的未捕获异常会直接终止程序需在线程函数内通过try-catch捕获并处理分离线程的生命周期主线程退出前需确保分离线程完成核心逻辑避免线程被强制终止。总结C11std::thread通过绑定可调用对象创建线程必须通过join()等待完成或detach()分离否则会引发未定义行为向线程传递引用参数需使用std::ref()包装joinable()可用于判断线程是否可执行等待 / 分离操作多线程编程需注意共享数据同步、异常捕获以及分离线程的生命周期管理避免数据竞争和程序崩溃。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2444871.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!