C中线程特定数据的示例

时间:2009-11-15 07:41:31

标签: c multithreading pthreads

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

我是Linux用户!

5 个答案:

答案 0 :(得分:7)

实际上,特定于线程的数据适用于您不希望在线程之间共享数据的情况 - 使用特定于线程的数据,每个线程可以使用相同的变量名称,但该变量引用不同的存储。

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

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

显然,完成后,您需要调用相应的例程来清理数据。您可以使用pthread_cleanup_push来安排清理例程以释放与特定于线程的密钥关联的任何数据结构,并且可以在密钥不再使用时使用pthread_key_destroy

答案 1 :(得分:5)

原始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);

想象一下,如果几乎同时调用open和socket会导致混淆,两者都会以某种方式失败,并且都试图显示错误号!

要解决此问题,多线程运行时库会使errno成为特定于线程的数据项。

答案 2 :(得分:4)

您的问题的简短回答是:您无需在多个线程之间共享变量。默认情况下,所有全局变量都在所有线程之间共享。

当每个线程的变量必须不同时,如果您使用的是符合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

答案 3 :(得分:0)

答案 4 :(得分:0)

如果您使用的是Windows平台,这是一个很好的例子

http://msdn.microsoft.com/en-us/library/ms686991(VS.85).aspx