封装std::thread时出现异常行为,请求排查代码或测试问题
C++线程池ThreadObject封装问题排查
ThreadObject核心设计
- 内部用
std::thread实例mThread存储线程 - 用非原子
bool变量mIsFree标记线程空闲状态(知晓std::atomic<bool>更优,但认为谨慎处理下当前选择可行) - 用
std::mutex实例mThreadObjectMutex保护线程对象
构造、赋值与析构逻辑
- 无参构造函数:仅将
mIsFree设为true,未加锁 - 删除拷贝构造与拷贝赋值运算符(线程对象不可拷贝)
- 移动构造与移动赋值运算符:等待线程空闲后
swapmThread - 析构函数:仅执行线程
join操作
核心任务执行函数
execute函数:接收std::function<void()>类型任务,执行前将mIsFree设为false,任务结束后设为true;若线程处于忙碌状态则等待join函数:用于显式调用线程join
Google Test测试异常情况
- 模拟任务通过
sleepForSeconds函数实现(循环等待指定时长) - 移动构造测试:启动线程执行1秒任务,等待0.5秒后触发移动构造,预期耗时0.5秒,但实际耗时为0
execute函数测试:连续执行两次1秒任务,第一次执行0.5秒后调用第二次execute,预期耗时0.5秒但实际为0,且后续isThreadFree的判断结果不符合预期- 特殊现象:不使用
sleepForSeconds等待时,所有测试均正常
疑问
当前代码是否存在错误?还是测试用例本身有问题?
内容的提问来源于stack exchange,提问作者Christ Liu
相关产品推荐
相关产品推荐

