博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程存储简介
阅读量:5972 次
发布时间:2019-06-19

本文共 1513 字,大约阅读时间需要 5 分钟。

在多线程程序中,所有线程共享程序中的变量。Linux有一全局变量,所有线程都可以使用它,改变它的值。如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,但它的值在每一个线程中又是单独存储的。

线程存储的具体用法:

  1. 创建一个类型为pthread_key_t类型的变量。

  2. 调用pthread_key_create()来创建该变量,该函数有两个参数,第一个参数就是上面声明的 pthread_key_t变量,第二个参数是一个清理函数,用来在线程释放该线程存储的时候被调用,该函数指针可以设成NULL,这样系统将调用默认的清理函数;

  3. 当线程中需要存储特殊值的时候,可以调用pthread_setspcific(),该函数有两个参数,第一个为前面声明的pthread_key_t变量,第二个为void*变量,这样可以存储任何类型的值;

  4. 如果需要取出所存储的值,调用pthread_getspecific(),该函数的参数为前面提到的 pthread_key_t变量,该函数返回void*类型的值;

  5. 注销使用pthread_key_delete()函数,该函数并不检查当前是否有线程正在使用,也不会调用清理函数,而只是释放以供下一次调用pthread_key_create()使用。

下面是前面提到的函数原型:

int pthread_setspecific(pthread_key_t key, const void *value);void* pthread_getspecific(pthread_key_t key);int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));int pthread_key_delete(pthread_key_t *key);

线程存储例子:

#include 
#include
static pthread_key_t thread_key;void* thread_function(void* args){ pthread_t spid = pthread_self(); pthread_setspecific(thread_key, (void *)spid); pthread_t gpid = (pthread_t)pthread_getspecific(thread_key); printf("set: %lu, get: %lu, %s\n", spid, gpid, (spid == gpid ? "equal":"not equal")); return NULL;}int main(int argc, char** argv){ int i; pthread_t threads[5]; pthread_key_create(&thread_key, NULL); for (i = 0; i < 5; ++i) { pthread_create(&(threads[i]), NULL, thread_function, NULL); } for (i = 0; i < 5; ++i) { pthread_join(threads[i], NULL); } pthread_key_delete(thread_key); return 0;}

参考文章

转载地址:http://vczox.baihongyu.com/

你可能感兴趣的文章
Linux下Django环境安装
查看>>
如何在指定的内容中找出指定字符串的个数
查看>>
我的友情链接
查看>>
浅谈如何用We7站群平台打造垂直性政务网站
查看>>
我的友情链接
查看>>
Spring MVC请求处理流程分析
查看>>
生产环境MySQL 5.5.x单机多实例配置实践
查看>>
Web应用工作原理、动态网页技术
查看>>
EXCEL工作表保护密码破解 宏撤销保护图文教程
查看>>
Catalan数(卡特兰数)
查看>>
.Net Core下使用 RSA
查看>>
python 数据库中文乱码 Excel
查看>>
利用console控制台调试php代码
查看>>
递归算法,如何把list中父子类对象递归成树
查看>>
jsf初学解决GlassFish Server 无法启动
查看>>
hdu 1050 (preinitilization or postcleansing, std::fill) ...
查看>>
Form各键盘触发子所对应的“按键”
查看>>
【java IO】使用Java输入输出流 读取txt文件内数据,进行拼接后写入到另一个文件中...
查看>>
第一次模拟面试
查看>>
window.showModalDialog
查看>>