linux api笔记(6):线程(四) 线程私有数据
本文将描述线程的一个比较重要的一方面:线程私有数据,如下代码:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
pthread_key_t kKey = 0;
void * ThreadProc(void* arg)
{
char* a = (char*)(arg);
sleep(2);
pthread_setspecific(kKey, a);
sleep(1);
char* str = (char*)pthread_getspecific(kKey);
printf("thread: %s\n", str);
}
int main()
{
pthread_t thread_handle1 = 0;
pthread_t thread_handle2 = 0;
char a[] = {"i am A"};
char b[] = {"i am B"};
pthread_create(&thread_handle1, NULL, ThreadProc, a);
pthread_key_create(&kKey, NULL);
pthread_create(&thread_handle2, NULL, ThreadProc, b);
void* out1 = NULL;
void* out2 = NULL;
pthread_join(thread_handle1, &out1);
pthread_join(thread_handle2, &out2);
return 0;
}
使用线程私有数据的步骤:
1)使用pthread_key_create分配一个线程私有数据的key,这里需要注意的是当我们调用了这个函数
之后进程中所有的线程都可以使用这个key,并且通过这个key获取到的私有数据是互不相同的,比如线程
A通过key设置了数据D,但线程B并没有设置数据,那么A通过key获取的数据当然是D,而B获取的是一个
空的值。另外需要注意的是不管线程是在pthread_key_create调用之前或之后产生,它都能够在函数调用
之后使用这个key。
2)使用pthread_setspecific函数将key和一个线程私有数据绑定。
3)通过pthread_getspecific函数和key获取到这个线程的私有数据。
我一直觉得线程私有数据策略很好用,但考虑到使用过程中需要进行“系统调用”(pthread_getspecific是系统调用吗?),
如果比较频繁地调用这个函数的话说不定会使程序的性能下降,但看了man文档中的一句话后这个中顾虑稍微减轻,尽管还是有疑问:
“the function to pthread_getspecific() has been designed to favor speed and simplicity over error reporting”
上面说它的速度已经被设计地很快了。
相关文档:
嵌入式Linux开发需要的参考资料
作者: 来源于: 发布时间:2008-10-6 20:45:00
引导:
如需获得对
vmlinux
和
zimage
之间区别的极好解释,请在
Alessandro Rubini
编写的
“
Kernel Configuration: dealing with the unexpected
(
Linux Magazine
)的一文中找到
&ld ......
Linux下解压压缩及打包命令大全
[日期:2008-11-04]
来源: 作者:jenen
———————————————
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
&mdas ......
在Linux用c编程,很多时候都会碰到结构体这个概念,尤其是使用指针访问结构体成员。(下面的文字介绍,请参考代码理解)
1. 使用一个新运算符:->,这个运算符有一个连接号(-)后跟一个大于符号(>)组成
&nbs ......
[经过安装测试成功的方法from CYBEND ]
第一步:系统与软件的准备
系统版本 redhat enterprise linux 5 ,内核版本 2.6.18
第二步:软件包的准备
httpd软件包:httpd-2.2.8.tar.bz2
mysql软件包从mysql官方网站下载,我选用的是ehel5的rpm包
MySQL-server-community-5.0.51a-0.rhel5.i386.rpm
MySQL-client-community ......