每个线程 C++ 保护以防止重入函数调用
per thread c++ guard to prevent re-entrant function calls
我有一个函数,可以调用可能失败的注册表并打印失败原因。
这个函数也可以直接或间接地从专用的内置打印函数的上下文中调用,我希望在这种情况下避免打印原因,以避免无休止的递归。
我可以使用thread_local
来定义每个线程标志以避免从此函数调用打印函数,但我想这是一个相当普遍的问题,所以我正在寻找这个保护或任何其他调试良好的代码std
实现。
下面是一个刚刚用来表达问题的示例。 每个打印函数都带有日志级别,并与驻留在注册表中的当前日志级别阈值进行比较。如果低于阈值,则函数返回而不打印。但是,为了获得阈值,可以进行额外的打印,因此我想创建一个保护,以防止打印getPrintLevelFromRegistry
如果从print
调用
int getPrintLevelFromRegistry() {
int value = 0;
DWORD res = RegGetValueW("//Software//...//logLevel" , &value);
if (res != ERROR_SUCCESS) {
print("couldn't find registry key");
return 0;
}
return value;
}
void print(const char * text, int printLoglevel) {
if (printLogLevel < getPrintLevelFromRegistry()) {
return;
}
// do the print itself
...
}
谢谢!
问题的根源在于您正在尝试让日志记录代码本身记录。 与其考虑一些复杂的防护,不如考虑这样一个事实,即您确实不需要记录注册表读取。 只需让它返回默认值并将错误记录到控制台即可。
int getPrintLevelFromRegistry() {
int value = 0;
DWORD res = RegGetValueW("//Software//...//logLevel" , &value);
if (res != ERROR_SUCCESS) {
OutputDebugStringA("getPrintLevelFromRegistry: Can't read from registryrn");
}
return value;
}
此外,可以从注册表中读取每个日志语句,但这是冗余且不必要的。
更好:
int getPrintLevelFromRegistry() {
static std::atomic<int> cachedValue(-1);
int value = cachedValue;
if (value == -1) {
DWORD res = RegGetValueW("//Software//...//logLevel" , &value);
if (res == ERROR_SUCCESS) {
cachedValue = value;
}
}
return value;
}
相关文章:
- 使用 std::string () const 函数启动线程或未来
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 是否可以创建一个从不同类调用函数的线程?
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 析构函数和线程安全
- std::使用类成员函数创建线程 - 最佳实践
- 当加入 C++11 函数的线程仍未终止时,是否可以返回?
- 参数包推导不一致 int 和 int& 在可变参数模板化成员函数中创建运行成员函数的线程
- C++中向量和列表的非写入成员函数的线程安全性
- 无效使用非静态成员函数 c++ 线程 linux
- 如何在单独的线程上运行函数(如果线程可用)
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 通过类构造函数创建线程
- 如何用函数制作线程:C++
- 无法找出此错误(将结构数组传递给函数):线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x1)
- 迷宫构造函数问题 [线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)]
- C++重用调用同一函数的线程向量
- 模板函数作为线程调用时不会编译
- 如何计算用于调用函数的线程数
- Boost::thread如何获得一个指向调用我的函数的线程的指针