具有多线程的静态变量

时间:2011-04-22 20:59:59

标签: c multithreading static

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

3 个答案:

答案 0 :(得分:5)

您想要的是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。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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