C++11实现线程池:项目实现过程的报错与gdb调试

一、固定线程池------FixedThreadPool

(1)没有输出func,且显示核心转储

线程池对象被销毁时,池子里的 std::thread 线程对象还处于 joinable() 状态(既没 join() 也没 detach()),C++ 标准强制调用 std::terminate() 终止程序。

日志里出现了 func,说明线程池的任务函数执行了,但线程没被正确回收。

**失败原因:**将任务添加到线程池,因为主线程的运行速度太快,连执行的机会都没有就结束了

**改进:**做了休眠,等待任务执行

gdb调试:

0 __GI_raise → 发出 SIGABRT 信号

1 __GI_abort → 终止程序

2 std::terminate() → C++ 强制终止(因为线程没 join)

3 std::thread::~thread() → 线程对象析构时发现还没 join ...

16 std::list::clear() → 你的线程组被清空了

17 pool::FixedThreadPool::StopThreadGroup() → 你的 Stop 函数

21 call_once → 确保 StopThreadGroup() 只执行一次

27 Stop() → 析构里调用 Stop()

28 ~FixedThreadPool() → 线程池析构函数

31 main() → 程序入口

pool::FixedThreadPool::StopThreadGroup() 就是StopThreadGroup 函数!

**崩溃的直接原因就是:**在 StopThreadGroup 里调用了 list::clear(),而此时线程还没被 join。

std::this_thread::yield():主线程让出CPU会导致偶尔打印不出来

问题根源:yield 不是用来 "等待" 的

std::this_thread::yield() 的作用是让出当前的 CPU 时间片,它只会让主线程 "暂停一小会儿",但不会等待任何条件完成。

在这个场景里:

  1. 主线程调用 yield(),让出 CPU
  2. 调度器可能马上又把 CPU 分给主线程,也可能分给工作线程
  3. 如果调度器又给了主线程,主线程会立刻继续执行 return 0,程序直接退出
  4. 工作线程还没来得及执行 cout,程序就结束了,所以打印不出来

yield() 是 "让一下",不是 "等一下",所以它的等待效果是不可靠的、随机的,这就是你偶尔能打印、偶尔不行的原因。

  • ac:9999 先打印出来了
  • 但最后一个任务 func:9999 才打印出来
  • 说明主线程提前执行了 cout << "ac:",但此时最后一个任务还没执行完

(2)线程池的拒绝策略

相关推荐
程序喵大人3 天前
【C++进阶】STL容器与迭代器 - 10 把容器、迭代器和数据流串成一个小程序
开发语言·c++·容器·小程序·迭代器·stl
誰能久伴不乏5 天前
深入解析 C++ STL 底层原理:从设计哲学到内存收割机
c++·架构·stl
阿米亚波6 天前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
阿米亚波7 天前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
程序喵大人7 天前
【C++进阶】STL容器与迭代器 - 08 插入删除之后,哪些迭代器会失效
开发语言·c++·容器·迭代器·stl
鱼子星_7 天前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
一拳一个呆瓜8 天前
【STL】iostream 编程:输入流成员函数
c++·stl
程序喵大人10 天前
【C++进阶】STL容器与迭代器 - 05 map 和 set 为什么按键保持有序
开发语言·c++·容器·迭代器·stl
‎ദ്ദിᵔ.˛.ᵔ₎12 天前
Git GDB/CGDB调试器
git·gdb
一拳一个呆瓜14 天前
【STL】iostream 编程:检测提取操作产生的错误
c++·stl