Api 防止重入和强制一致状态

Api 防止重入和强制一致状态,api,sdk,consistency,reentrancy,Api,Sdk,Consistency,Reentrancy,假设我有一个C API,看起来像这样: // configure various parameters int set_option(const char* name, const char* value); // callback invoked during long running operation typedef int (*callback_t)(void* whatever); // start a long running operation int some_long_op

假设我有一个C API,看起来像这样:

// configure various parameters
int set_option(const char* name, const char* value);

// callback invoked during long running operation
typedef int (*callback_t)(void* whatever);

// start a long running operation
int some_long_operation(callback_t callback);
这些函数被记录为不可重入。我应该尝试强制执行这一点(例如,通过在某处设置标志并返回适当的错误代码),还是应该将其作为未定义的行为进行注销?我看到的大多数代码都没有尝试这样做;我只是想知道这是一个有意识的决定,还是实用主义(或者懒惰)。在我看来,如果你想写真正健壮的代码,你可以尝试这样的东西;另一方面,如果您没有遵循文档,那么可能所有赌注都应该取消


作为一个负责维护SDK的团队的成员,我的经历有时令人恐惧。虽然我们的文档不是很好,但我在OEM支持请求中看到了一些非常奇怪的事情。其中很多函数是在另一个函数调用的回调上下文中调用函数的。其中大多数都被记录为不受支持,但我们没有任何代码来阻止它;事实上,大多数情况下,这似乎是可行的,但有些可能实际上垃圾我们的内部状态。看起来有时候强制正确使用API可能比依靠人们阅读文档更容易。

当你说reentrancy时,你是否也包括线程安全(即,此函数不是线程安全的)在这个问题上,我只关心可重入性,尽管我认为线程安全可以用类似的方式处理。当你说可重入性时,你是否也包括线程安全(即,这个函数不是线程安全的)在这个问题上,我只关心可重入性,尽管我认为线程安全可以以类似的方式处理。