linux线程之线程私有数据 pthread_key_create方法的学习
来源:互联网 发布:jquery获取json数据 编辑:程序博客网 时间:2024/05/02 04:54
因为项目中需要用到主线程类共享所有数据,而主线程又要生成几个线程,而几个线程要用到主线程的数据,
因此每个线程要保存一个主线程类指针,类似于自己的私有资源。因此就要用到
用到这个类的主要是因为如果用多线程对同样的资源同步的话,就要对资源进行加锁,,,多线程就要同步
那么同步就会涉及到线程的切换问题,而频繁切换就会导致cpu工作压力增大,因此,根据适合的清苦啊利用适合的方法很重要。。。。
下面开始介绍pthread_key_create的使用
#include <pthread.h>int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
还有
pthread_getspecific(), pthread_key_delete(),
几个函数
因此进行对其封装,每次调用设置全局变量就OK
下面代码仅供学习
/** create by wallwind mail:wochenglin@qq.com 2012/11/1**/#ifndef _MyTLS_h__#define _MyTLS_h__#include <pthread.h>enum {NAME_SIZE =20,THREAD_NUM=10,};//typedef DWORD pthread_key_t;const pthread_key_t INVALID_PTHREAD_KEY = (pthread_key_t)0xFFFFFFFF;//typedef void (*destory_callback)(void*);//MyTLSPtr必须为进程全局变量,并且在初始化时直接申请key,而不是在第一次set时使用once方式来初始化key//暂时不使用线程关闭时自动释放的方式,仍然使用谁创建谁释放的原则class MyTLSPtr{public: MyTLSPtr():m_key(INVALID_PTHREAD_KEY) { init(); } virtual ~MyTLSPtr() { destory(); }public: template< typename T > void set(T* pPtr) { pthread_setspecific(m_key, pPtr); } template< typename T > T* get() const { return static_cast<T*>(pthread_getspecific(m_key)); } void init() { if(m_key != INVALID_PTHREAD_KEY) { destory(); } pthread_key_create(&m_key, NULL); } void destory() { if(m_key == INVALID_PTHREAD_KEY) return; pthread_key_delete(m_key); m_key = INVALID_PTHREAD_KEY; }private: pthread_key_t m_key; //destory_callback m_pCallBack;};template< typename T >class MyTLSTypePtr : public MyTLSPtr{public: MyTLSTypePtr() :MyTLSPtr() {} virtual ~MyTLSTypePtr() {}public: void set(T* pPtr) { MyTLSPtr::set<T>(pPtr); } T* get() const { return MyTLSPtr::get<T>(); }};#endif // MyTLS_h__
使用文件
//create by wallwind mail:wochenglin@qq.com 2012/11/1
#include <malloc.h>#include <pthread.h>#include <stdio.h>#include "MyTLS.h"//enum {NAME_SIZE =20,THREAD_NUM=10,};MyTLSPtr g_TLS;void write_to_thread_log (const char* message);void* thread (void* args){ char log[NAME_SIZE]; FILE* file; sprintf(log,"thread_%d.log",(int)pthread_self()); file = fopen (log, "w"); g_TLS.set(file); write_to_thread_log ("message test");}void write_to_thread_log (const char* message){ FILE* thread_log = g_TLS.get<FILE>(); fprintf (thread_log, "%s\n", message);}int main(){ int i; pthread_t threads[THREAD_NUM]; for(i = 0; i<THREAD_NUM;i++) //创建线程 pthread_create(&threads[i],NULL,thread,NULL); for(i = 0;i<THREAD_NUM;i++) //主线程阻塞生成线程 pthread_join(threads[i],NULL); return 0;}
生成的文件为
更多文章,欢迎关注 http://blog.csdn.net/wallwind
- linux线程之线程私有数据 pthread_key_create方法的学习
- pthread_key_create()--创建线程私有数据|pthread_key_delete()--注销线程私有数据
- 线程存储之pthread_key_create()
- linux线程的私有数据
- linux线程的私有数据
- linux线程私有数据
- linux线程私有数据
- Linux线程私有数据
- Linux学习笔记:线程私有数据
- 线程的私有数据
- 线程的私有数据
- 线程的私有数据
- 线程的私有数据
- linux线程私有数据的保护
- POSIX线程专有数据的空间释放问题,pthread_key_create
- POSIX线程专有数据的空间释放问题,pthread_key_create
- Linux线程私有数据pthread_key_t
- linux线程私有数据详解
- redis密码管理
- 数字 字母 验证 正则表达式
- Peekmessage和Getmessage的区别
- 求1000以内偶数的和
- 解决org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlTok
- linux线程之线程私有数据 pthread_key_create方法的学习
- node.js安装与使用
- C++学了这么多年,你仍不知道的事!!!
- Mysql 题目
- catalina.bat脚本解析
- java中静态代码块,非静态代码块的用法 static用法详解
- 最小生成树——prim算法
- Oracle各服务介绍
- myeclipse7.0之后版本添加插件方法