十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

启动线程、等待/分离、传递参数、转移所有权及获取线程ID

启动线程、等待/分离、传递参数、转移所有权及获取线程ID 《C并发编程实战》第 2 章线程管理的核心内容为您整理一套包含启动线程、等待/分离、传递参数、转移所有权及获取线程ID的标准 C 多线程示例代码。1. 基础示例启动线程与等待/分离展示最基本的std::thread创建、join()等待结束与detach()后台运行。#includeiostream#includethread#includechronovoidprint_hello(){std::this_thread::sleep_for(std::chrono::milliseconds(500));std::cout[子线程 1] Hello from thread!\n;}intmain(){// 1. 启动线程执行普通函数std::threadt1(print_hello);// 2. 启动线程使用 Lambda 表达式std::threadt2([](){std::cout[子线程 2] Hello from Lambda thread!\n;});// 必须在 std::thread 对象销毁前调用 join() 或 detach()if(t1.joinable()){t1.join();// 等待 t1 执行完毕}if(t2.joinable()){t2.join();// 等待 t2 执行完毕}std::cout[主线程] 所有线程已执行完毕。\n;return0;}2. 传递参数与引用std::ref向线程函数传参时默认是以拷贝值传递方式进行的。如果需要传递引用必须使用std::ref。#includeiostream#includethread#includestring// 接收值传递与引用传递voidupdate_data(intid,std::string name,intvalue){std::cout线程 id (name) 正在更新数据...\n;value100;}intmain(){intcount10;// 传入普通参数对引用参数必须用 std::ref 显式包装std::threadt(update_data,1,Worker,std::ref(count));t.join();std::cout[主线程] 更新后的 count 值: count (期望值: 110)\n;return0;}3. 所有权转移与线程 IDstd::thread是不可拷贝的但可以通过std::move转移其所有权。同时可以通过get_id()获取线程标识符。#includeiostream#includethread#includevectorvoidworker_function(){std::cout子线程 ID: std::this_thread::get_id()\n;}intmain(){std::cout主线程 ID: std::this_thread::get_id()\n;// 1. 所有权转移 (Move)std::threadt1(worker_function);std::coutt1 的 ID: t1.get_id()\n;// 将 t1 的所有权转移给 t2std::thread t2std::move(t1);std::cout转移后 t1 是否可 join: (t1.joinable()?是:否)\n;std::cout转移后 t2 的 ID: t2.get_id()\n;t2.join();std::cout-------------------------\n;// 2. 容器管理多个线程常见应用场景std::vectorstd::threadworkers;for(inti0;i3;i){// 使用 emplace_back 直接在容器内构造线程自动处理 moveworkers.emplace_back([](intid){std::cout批量线程 [id] 正在运行ID: std::this_thread::get_id()\n;},i);}// 统一等待所有线程完成for(autoworker:workers){if(worker.joinable()){worker.join();}}return0;}4. 进阶数据竞争与互斥锁std::mutex在多线程读写共享资源时必须使用锁机制保证线程安全。#includeiostream#includethread#includemutex#includevectorintcounter0;std::mutex mtx;// 互斥锁用于保护 countervoidincrement(intiterations){for(inti0;iiterations;i){// 使用 std::lock_guard 自动加锁与解锁RAII 机制std::lock_guardstd::mutexlock(mtx);counter;}}intmain(){std::vectorstd::threadthreads;// 启动 5 个线程每个线程累加 10000 次for(inti0;i5;i){threads.emplace_back(increment,10000);}for(autot:threads){t.join();}std::cout最终 counter 结果: counter (期望值: 50000)\n;return0;}编译说明使用 GCC / Clang 编译时请添加-pthread标志g-stdc11-pthreadmain.cpp-omain ./main
返回列表