2009-11-15 27 views
2

有人知道(或可以发布)使用线程特定数据的示例吗?我正在寻找清楚解释并易于理解的内容。我有一个全局char *变量,我想要在几个线程之间共享,我想这是C中线程特定的数据机制,对吗?C中线程特定数据的示例

我是Linux用户!

回答

4

从原来的C运行时库的errno变量是好例子。如果一个进程有两个线程在进行系统调用,那么这对于共享变量来说是非常糟糕的。

线程1:

int f = open (...); 
if (f < 0) 
    printf ("error %d encountered\n", errno); 

线程2:

 
int s = socket (...); 
if (s < 0) 
    printf ("error %d encountered\n", errno); 

想象的混乱,如果开放和插座在叫大约在同一时间,都失败不知何故,并且都试图显示错误数!

为了解决这个问题,多线程运行时库使errno成为线程特定数据的一个项目。

3

你的问题的简短答案是:你不必做任何事情来共享多个线程之间的变量。所有全局变量默认在所有线程之间共享。

当一个变量是为每个线程不同,如果您使用的是ISO-C99兼容的实现(如GCC),您只需将__thread存储类关键字添加到您的变量声明,如:

__thread char *variable; 

这将指示构建链(cc,ld,ld.so,libc.so和libpthread.so)中的所有层以特定的线程特定方式操作此变量。

下面的编译器支持这种语法(CF wikipedia):

  • 的Sun Studio C/C++
  • IBM XL C/C++
  • GNU C
  • 英特尔C/C++(Linux系统)
  • 的Borland C++ Builder的
+0

您是否对'__thread'是ISO-C99标准的一部分的参考? – pmg 2009-11-15 13:28:42

+0

@pmg:在gcc文档中,此功能被记录为C99实现的一部分:http://gcc.gnu.org/onlinedocs/gcc/C99-Thread_002dLocal-Edits.html – Jerome 2009-11-17 06:24:12

6

事实上,螺纹-SP当你不想在线程之间共享数据时 - 特定于线程的数据,每个线程可以使用相同的变量名称,但该变量指向不同的存储。

使用gcc,您可以使用“__thread”属性将变量声明为线程特定的。如果你只是试图创建一个原始类型的线程特定的,而你只处理Linux和GCC,那么这是一个可能的解决方案。如果你真的想要可移植,但是,在各种unices之间(一个想要的目标),或者如果你想制作复杂的数据类型的线程特定的,比你需要使用UNIX例程...

The它在UNIX中的工作方式是在生成任何线程之前使用phread_key_create,以创建唯一的变量名称。然后,您使用phread_setspecificpthread_getspecific修改/访问与密钥关联的数据。 set/get特定函数的语义是键作为映射的索引,其中每个线程都有自己的映射,因此从不同线程执行这些例程会导致访问/修改不同的数据。如果您可以使用地图,则可以使用线程特定的存储。

很明显,当你完成后,你需要调用适当的例程来清理数据。您可以使用pthread_cleanup_push安排清理例程以释放与线程专用密钥关联的任何数据结构,并且可以在密钥不再使用时使用pthread_key_destroy