【问题标题】:Is there a way to use thread local variables when using ACE?使用ACE时有没有办法使用线程局部变量?
【发布时间】:2011-01-26 02:52:51
【问题描述】:

我正在使用 ACE 线程,并且需要每个线程都有自己的 int 成员。 这可能吗?

【问题讨论】:

  • 出于好奇,您真的需要使用 TSS 吗?您是否可以简单地在线程堆栈上声明变量,或者您是否正在寻找某种方法来阻止其他线程访问您的变量?如果是后者,为什么不使用锁呢?有些人认为 TSS 主要是遗留接口的拐杖(例如,使 errno 线程安全),并且锁是更好的方法。我不提倡其中一种。 YMMV。
  • 我认为TSS实际上是这种情况下最优雅的解决方案。我有 n 个线程,每个线程都应该有自己的变量(具有自己的值)。
  • 您提到希望每个线程都有自己的“成员”。这表明您正在使用类来表示您的线程。如果是这样,那么只需给类一个普通的成员变量。每个线程都有自己的类实例,因此它也有自己独立的成员变量。

标签: c++ multithreading thread-local ace


【解决方案1】:

ACE 将此称为“线程特定存储”。看看这个:ACE_TSS。这就是我所知道的一切,抱歉,无法提供更多帮助。

thread-local storage 的维基百科页面说也有一种 pthreads 方法可以做到这一点。

【讨论】:

  • 它有时在 pthreads 中调用 TSS 或 TSD(线程特定数据)。这是一个描述如何使用 pthreads API 创建此类数据的链接:opengroup.org/onlinepubs/000095399/functions/…。在 UNIX/类 UNIX 平台上,ACE 只是在底层使用 pthread。
【解决方案2】:

其平台特定。以 Windows 为例,您应该使用__declspec( thread )。编译器将利用TLS API(TlsAlloc、TlsFree 和朋友),并且在 Win32 上,您应该始终使用 FLS(光纤本地存储)而不是 TLS,但 TLS API 在任何现代 Win32 版本上都会默默地将您重定向到 FLS。

【讨论】:

    【解决方案3】:

    是的。您可以使用ACS_TSS<type> 模板,该模板专为“线程特定存储”(即:线程局部变量)而设计。

    详情请见docs on ACE_TSS

    【讨论】:

      【解决方案4】:

      GCC 直接支持TLS for some targets。您可以使用 GCC 特定的 __thread 关键字来定义线程局部变量(必须是静态的或全局的)。

      libACE 本身内置了线程本地的东西,您可以查看documentation 并查看example code

      【讨论】:

        【解决方案5】:

        没有办法让 ACE_TSS 为所有线程设置初始值;不过,您可以在进入线程函数后轻松设置初始值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-30
          • 2016-05-23
          • 2022-11-11
          • 2017-07-20
          • 2018-03-07
          • 2019-10-11
          • 2021-10-07
          • 1970-01-01
          相关资源
          最近更新 更多