【问题标题】:static variable with multithreading多线程静态变量
【发布时间】:2011-04-22 20:59:59
【问题描述】:

我有一个多线程 C 代码,我想将一个全局变量设为线程私有。也就是说,每个线程都有它自己的副本......这样做的最佳方式是什么?

【问题讨论】:

  • 您正在寻找线程本地存储(也称为线程特定存储)。你如何得到它取决于编译器,但如果你用谷歌搜索其中一个以及你正在使用的编译器,你应该找到一些信息(或者你可以告诉我们你正在使用什么编译器......)跨度>
  • 目前我正在使用 gcc 但计划切换到 icc...没有编译器独立的方式吗?
  • 对于icc使用__declspec(thread)获取线程本地存储
  • 并且没有便携的方法可以做到这一点。 C 没有标准化线程。

标签: c multithreading static


【解决方案1】:

你想要的是TLS。 TLS 的声明与任何其他全局(静态)变量一样,但语法取决于实现。例如:

// Visual C/C++ and Intel C/C++ on Windows
__declspec(thread) int number;

// GCC and Intel C/C++ on Linux
__thread int number;

Boost 和 TBB 有自己的可移植 TLS,但它是 C++,而不是 C。

【讨论】:

    【解决方案2】:

    对于 Windows NT 引擎,可以在启动线程时将指针传递给线程。这个指针可以指向任何可以指向的东西:在你的例子中是一个变量。

    我个人更喜欢让它指向索引结构的成员,其中每个成员都属于特定线程并包含与线程相关的信息,例如句柄、处理统计信息等。

    如果你走这条路,请记住索引结构的每个成员的大小应该等于处理器缓存线大小的偶数倍(x86 上为 32 或 64 字节),否则线程将开始相互冲突访问它们各自的结构时的缓存。索引结构也应该从缓存行大小的偶数倍开始。

    【讨论】:

      【解决方案3】:

      您描述的是局部变量,而不是全局变量。

      通过使用C 习惯用法使变量成为实例变量,例如将参数传递给线程,可以轻松安排。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-31
        • 1970-01-01
        • 2011-07-17
        • 2011-06-03
        • 1970-01-01
        • 2012-01-15
        • 2013-03-29
        相关资源
        最近更新 更多