有人知道(或可以发布)使用特定于线程的数据的示例吗?我正在寻找一些清楚解释且易于理解的东西。我有一个全局char *变量,我想在几个线程之间共享,我认为这就是C中特定于线程的数据机制,我是对的吗?
我是Linux用户!
答案 0 :(得分:7)
实际上,特定于线程的数据适用于您不希望在线程之间共享数据的情况 - 使用特定于线程的数据,每个线程可以使用相同的变量名称,但该变量引用不同的存储。
使用gcc,您可以使用“__thread”属性将变量声明为特定于线程。如果您只是尝试创建一个特定于线程的原始类型,并且您只处理Linux和GCC,那么这是一个可能的解决方案。但是,如果你真的希望在各种unices(一个可取的目标)之间移植,或者你想要使复杂的数据类型特定于线程,那么你需要使用UNIX例程......
它在UNIX中的工作方式是在生成任何线程之前使用phread_key_create,以便创建唯一的变量名。然后,您可以使用phread_setspecific和pthread_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):
答案 3 :(得分:0)
GIYF:示例代码pthread_mutex_init
答案 4 :(得分:0)
如果您使用的是Windows平台,这是一个很好的例子
http://msdn.microsoft.com/en-us/library/ms686991(VS.85).aspx