new TaskNode只使用一次，封成独立函数有点浪费吧。锁的范围已经改成只管辖m_completed_tasks操作的部分