gpt4 book ai didi

C++:确保在编译时仅在指定线程上调用该函数

转载 作者:行者123 更新时间:2023-11-27 23:41:12 24 4
gpt4 key购买 nike

我有一个方法可以修补非线程安全的复杂结构。通常,这不是问题,因为基本上所有对该方法的调用都应该从初始化阶段进行,该阶段应该在单个线程中运行(与我们启动的线程相同 main() 与)。

但是,看起来我的代码库中的某些恶意组件确实是从非主线程调用此方法。我显然可以在此方法中添加一个互斥锁/锁保护器来防止潜在的调用,但是,从我的角度来看,这是一种解决方法,而不是我正在寻找的解决方案。

当然,我也可以添加一个运行时断言,比如:

static std::thread::id s_main_thread_id

int main(...) {
s_main_thread_id = std::this_thread::get_id();
// ...
}

void vulnerable_function() {
ASSERT(std::this_thread::get_id() == s_main_thread_id);
}

...但这不是保证。

问题: 是否有可能以某种方式在编译时断言某个方法应该只从某个(即主)线程运行?我想在我的代码库中找到恶意调用并防止这种情况再次发生。

我已经查看了 assert-like contracts在 C++20 中,但如果我走在正确的道路上和/或我可以应用它。

最佳答案

您可以做的是构建一些断言宏。使用您的线程库获取线程标识符。在您的代码第一次构建该数据结构时保存线程 ID。然后在每次输入这些函数时断言它与当前线程 ID 匹配。

CEF(Chromium 嵌入式框架)库使用它。

通过像断言一样包装这些宏,预处理器将在设置了 -DNDEBUG 的发布版本中删除它们。

如果您不得不更进一步,CEF 还具有发布和处理消息的功能,以便其他线程可以通过向其发布消息来在 UI 线程上完成工作。

关于C++:确保在编译时仅在指定线程上调用该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54582887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com