<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[linux 多线程应用–线程内部私有的全局变量，多线程内的全局变量（私有数据）  。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Tue, 28 Oct 2014 02:18:41 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>在 单线程的程序里,有两种基本的数据:全局变量和局部变量。但在多线程程序里,还<br/>有第三种数据类型:线程数据(TSD: Thread-Specific Data)。它和全局变量很象,在线程<br/>内部,各个函数可以象使用全局变量一样调用它,但它对线程外部的其它线程是不可见<br/>的。这种数据的必要性是显而易见 的。例如我们常见的变量 errno,它返回标准的出错信<br/>息。<br/>它显然不能是一个局部变量,几乎每个函数都应该可以调用它;但它又不能是一个全<br/>局变量,否则在 A 线程里输出的很可能是 B 线程的出错信息。要实现诸如此类的变量,<br/>我们就必须使用线程数据。<br/>我们为每个线程数据创建一个键,它和这个键相关联,在各个<br/>线程 里,都使用这个键来指代线程数据,但在不同的线程里,这个键代表的数据是不同<br/>的,在同一个线程里,它代表同样的数据内容。<br/>下面的多线程程序在 Red Hat9 上的测试通过的线程私有的全局变量使用的例子。<br/>为了简便<br/>起见,省去了所有的错误处理代码。其中的变量 no 是线程私有变量,就相当于线程内部<br/>的全局变量,可以看到,对 no 的访问不 能通过 no 本身变量去访问,而是通过一个全局<br/>变量 key 间接的去访问。<br/>从程序运行时的输出可以发现:线程可以在任何函数中访问 no;<br/><br/>线程拥有各自的 no 存 储空间。<br/><br/>#include&lt;pthread.h&gt;;<br/>#include&lt;stdio.h&gt;;<br/>pthread_key_t key;<br/>void start();<br/>void work();<br/>int main()<br/>&#123;<br/>pthread_t tid1,tid2;<br/>pthread_key_create( &amp;key, NULL );<br/>pthread_create( &amp;tid1,NULL,(void *)start,NULL );<br/>pthread_create( &amp;tid2,NULL,(void *)start,NULL );<br/>pthread_join( tid1,NULL );<br/>pthread_join( tid2,NULL );<br/>pthread_key_delete( key );<br/>&#125;<br/>void start()<br/>&#123;<br/>int no;<br/>pthread_setspecific( key, &amp;no );<br/>work();<br/>&#125;<br/>void work()&#123;<br/>int *p_no,i;<br/>for( i=0;i&lt;20;i++ )&#123;<br/>p_no = pthread_getspecific( key );<br/>printf( &quot;%d:%d&#92;n&quot;, pthread_self(), *p_no );<br/>*p_no = *p_no+1;<br/>pthread_setspecific( key, p_no );<br/>sleep(1);<br/>&#125;<br/>&#125;<br/>说明:<br/>(1)<br/>线程 1, 2 共用了 key,<br/>通过 key,就可以存取只跟当前线程相关的一个值(这个值由编译器管理)<br/>线程 1-----&gt;key-----&gt;线程 1 相关的值(由编译器管理)<br/>线程 2-----&gt;key-----&gt;线程 2 相关的值(由编译器管理)<br/>设置&quot;线程相关的数据&quot;,使用<br/>int pthread_setspecific(pthread_key_t key, const void *pointer);<br/>读取&quot;线程相关的数据&quot;,使用<br/>void * pthread_getspecific(pthread_key_t key);<br/>注意到,这两个函数分别有一个 void 类型的指针,我们的线程就是通过这两个指针分别与<br/>&quot;线程相关的数据&quot;的数据进行交互的<br/>(2)<br/>由于 key 是一个全局变量,<br/>函数 work 不需要额外的参数就可以访问它;<br/>又因为它是&quot;线程相关的数据&quot;, 线程 1, 2 通过 key 存取的数据是相互独立的,<br/><br/>这样就不需要额外的互斥机制来保证数据访问的正确性了.<br/><br/>摘自：http://www.xuebuyuan.com/2047005.html<br/><br/>多线程内的全局变量（私有数据）&nbsp;&nbsp;：<br/>多线程环境下的私有数据(Thread-specific Data, TSD)：<br/>&nbsp;&nbsp;&nbsp;&nbsp;线程拥有自己的全局变量，这种特殊的变量仅在某个线程内部有效。线程的私有数据可以被其内部的所有函数访问，但是对其他线程是屏蔽的。线程私有数据采用了一种称为一键多值的技术，即一个键对应多个数值。访问数据时都是通过键值来访问，好像是对一个变量进行访问，其实是在访问不同的数据。<br/>&nbsp;&nbsp;&nbsp;&nbsp;操作线程私有数据的函数主要有4个：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_key_create(创建一个键)，pthread_setspecific(为一个键设置线程私有数据)，pthread_getspecific(从一个键读取线程私有数据)，pthread_key_delete(删除一个键)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include &lt;pthread.h&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int pthread_key_create(pthread_key_t *key, void (*destr_function)(void *));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int pthread_setspecific(pthread_key_t key, const void * pointer);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void* pthread_getspecific(pthread_key_t key);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int pthread_key_delete(pthread_key_t key);<br/><br/>来自：http://xsh8637.blog.163.com/blog/static/24099666201032125010616/<br/><br/>linux下C语言多线程（二）线程的私有数据：<br/>http://blog.csdn.net/zjl410091917/article/details/8000926
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] linux 多线程应用–线程内部私有的全局变量，多线程内的全局变量（私有数据）  。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>