gpt4 book ai didi

c++ - 检测对象何时传递给 C++ 中的新线程?

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:37 24 4
gpt4 key购买 nike

我有一个对象,我想跟踪引用它的线程数。通常,当对象上的任何方法被调用时,我可以检查线程局部 bool 值以确定当前线程的计数是否已更新。但是,如果用户说,使用 boost::bind 将我的对象绑定(bind)到 boost::function 并使用它来启动 boost::thread,这对我没有帮助。新线程将引用我的对象,并可能在调用它的任何方法之前无限期地保留它,从而导致过时计数。我可以围绕 boost::thread 编写自己的包装器来处理这个问题,但是如果用户 boost::bind 是一个包含我的对象的对象(我不能根据成员类型的存在——至少我不知道有什么方法可以做到这一点)并使用它来启动 boost::thread。

有什么办法吗?我能想到的唯一方法需要用户做太多工作——我提供了一个围绕 boost::thread 的包装器,它在传入的对象上调用一个特殊的 Hook 方法,前提是它存在,并且用户将特殊的 Hook 方法添加到任何类包含我的对象。

编辑:为了这个问题,我们可以假设我控制了创建新线程的方法。所以我可以包装 boost::thread,例如,期望用户会使用我包装的版本,而不必担心用户同时使用 pthreads 等。

Edit2:还可以假设我有一些可用的线程本地存储方式,通过 __threadboost::thread_specific_ptr。它不在当前标准中,但希望很快就会出现。

最佳答案

总的来说,这很难。 “谁对我有引用?”的问题在 C++ 中通常无法解决。可能值得从大局着眼于您尝试解决的特定问题,看看是否有更好的方法。

我可以想出一些可以帮助您完成目标的方法,但它们都不是您想要的。

您可以为一个对象建立“拥有线程”的概念,并拒绝来自任何其他线程的操作,一个 la Qt GUI 元素。 (请注意,尝试从所有者以外的线程安全地执行操作实际上不会为您提供线程安全,因为如果不检查所有者,它可能会与其他线程发生冲突。)这至少会让您的用户失败 -快速行为。

您可以通过让用户可见的对象成为对实现对象本身的轻量级引用来鼓励引用计数 [并通过记录这一点!]。但坚定的用户可以解决这个问题。

您可以将这两者结合起来——即您可以对每个引用 拥有线程所有权的概念,然后让对象知道谁拥有这些引用。这可能非常强大,但并不是真正的傻瓜化。

您可以开始限制用户可以和不能对对象执行的操作,但我认为除了明显的意外错误来源外,不值得涵盖其他内容。您是否应该声明 operator& private,这样人们就无法将指针指向您的对象?你应该阻止人们动态分配你的对象吗?这在某种程度上取决于您的用户,但请记住,您无法阻止对对象的引用,所以最终玩打地鼠游戏会让您发疯。

那么,回到我最初的建议:如果可能,重新分析全局。

关于c++ - 检测对象何时传递给 C++ 中的新线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049734/

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