【问题标题】:c++ identify current thread in function?c ++识别函数中的当前线程?
【发布时间】:2010-01-04 11:47:11
【问题描述】:

假设我有一个带有静态函数的单例对象:

static int MySingletonObject::getInt()

现在我想根据调用函数的工作线程(MFC 线程)返回不同的 int。

我知道我可以在创建线程时将参数传递给线程函数。但是有没有办法在没有来自这些参数的信息的情况下识别线程?

谢谢!

【问题讨论】:

  • 检查您是否可以访问GetCurrentThreadId() - 这似乎是您所需要的

标签: c++ windows multithreading mfc


【解决方案1】:

您可以调用 GetCurrentThreadId() - 将返回一个整数标识符 - 或 GetCurrentThread() - 将返回一个句柄,该句柄可以转换为整数标识符 - 从任何线程 - 这些值对于进程中的任何线程都是唯一的。

【讨论】:

  • 这样的电话有多贵?我打算在一些智能指针实现中使用它,它会在每次取消引用智能指针时被调​​用
  • 相当昂贵。在我的机器上循环执行 1 亿次调用需要 235 毫秒。我想在任何相当现代的机器上都是一样的。所以如果你经常调用这个函数,这可能是个问题。
  • 错了!windows将此信息保存在内存结构en.wikipedia.org/wiki/Win32_Thread_Information_Block中,所以它应该和从内存中获取整数值一样昂贵(应该非常便宜)
  • 该数据由 Windows 管理,检索它需要 API 调用,而且 API 调用相对昂贵。也许这“不可能是正确的”,但是除了运行它并确定其执行时间之外,没有合理的方法可以找出运行某些代码的成本。
  • 无论出于何种原因,这都可以更快。调试版本可以包括引入大量开销的各种检查。您应该只在对测量进行优化的情况下进行编译。
【解决方案2】:

你想要的是线程本地存储。阅读此内容以了解 TLS 的 Windows 实现:http://msdn.microsoft.com/en-us/library/ms686991%28VS.85%29.aspx

【讨论】:

    【解决方案3】:

    调用GetCurrentThreadId(在Windows机器上)它将返回调用函数正在运行的上下文中的线程ID

    【讨论】:

      【解决方案4】:

      听起来您确实像 Igor 建议的那样寻找线程本地存储 - 我会选择使用 boost.Thread 代码 (documentation here),因为:

      • 跨平台/编译器

      • 对于此类任务通常有用且方便

        (实际上我想知道你是否真的在尝试创建一些非常类似于 boost::thread_specific_ptr 的东西,因为你所说的关于你的需求)

      【讨论】:

        猜你喜欢
        • 2021-10-09
        • 2019-08-14
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 2020-02-12
        • 2017-02-25
        相关资源
        最近更新 更多