咨询C++中替代静态对象实现更安全确定销毁的方案
在C++中替代静态对象、实现更安全/确定销毁的方案
我维护着一个大型代码库,出于性能考量,我们需要限制对某些资源的访问——线程池就是绝佳的类比:我们不希望进程内的每个模块都自行创建线程,因此使用了带有生产者/消费者任务队列的公共线程池,来控制任意时刻运行的线程数量。
目前没有优雅的方式界定线程池的所有权,所以它实际上是一个单例,代码示例如下:
class ThreadPool { public: static void SubmitTask(Task&& t) { instance_.SubmitTask(std::move(t)); } private: ~ThreadPool() { std::for_each(pool_.begin(), pool_.end(), [](auto &t) { if (t.joinable()) t.join(); }); } private: std::array<std::thread, 5> pool_; static ThreadPool instance_; // here or anonymous namespace };
这种模式的问题在于instance_要在main函数返回后才会退出作用域,这通常会导致竞态条件或崩溃。请注意这只是我的问题的类比,我并非寻求异步操作的更佳实现,而是希望找到管理静态对象生命周期的更好方法。
我已想到的替代方案:
- 提供一个显式的
Terminate函数,必须在退出main前手动调用 - 完全不使用静态对象,由应用层确保仅存在一个实例
- 完全不使用静态对象,若实例化多个则触发程序崩溃
我也清楚一个小而精的团队或许能让上述代码正常运行,但该代码服务于拥有众多不同水平开发者的大型组织。
内容的提问来源于stack exchange,提问作者Josh A.
相关产品推荐
相关产品推荐

