检查异步方法已在析构函数中完成

时间:2014-01-28 17:44:05

标签: c++ asynchronous

我有一个目前看起来像这样的类(伪伪代码):

class AsyncStore {
public:
  AsyncStore();
  ~AsyncStore() {
    // Make sure writes have flushed somehow
  }

  void write_something() {
    // Issue an asynchronous write, and return immediately
  }

  void sync_writes() {
    // Check all writes could be flushed, and throw if any failed
  }
};

这就存在一个问题,即析构函数无法发出错误信号(我们无法抛出,我们无法以任何其他方式发出错误信号)。

理想情况下,此类的用户在调用析构函数之前会调用sync_writes(),并处理抛出的任何异常,因此在销毁时,无需执行任何操作。

目前看来,没有办法强制执行此操作。感觉这必须是一个相对常见的问题 - 是否有办法处理这个问题,以便我可以保证在销毁时没有待处理的写入?

1 个答案:

答案 0 :(得分:1)

您可以强制API使用者在销毁对象之前调用sync_writes。如果使用未完成的工作terminate()输入析构函数,或执行其他紧急操作(例如,不等待工作并记录错误)。

我认为这是一个API设计问题。只需确定调用者必须正确关闭对象并在运行时强制执行它。如果呼叫者违反了API合同,他们就无法获得正确的结果。

还有另一种方法:强制API使用者注册一个在出现错误时调用的回调。可以在构造函数中接受回调。