Linux多线程数据处理

和进程相比,线程的最大优点之一是数据的共享性高。但是在应用的过程中,我们必须当心有多个不同的进程访问相同的变量。许多函数是不可重入的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。为了保护变量,我们必须使用信号量、互斥等方法来保证我们对变量的正确使用。

´1)线程数据

在单线程的程序里,有两种基本的数据:全局变量和局部变量。但在多线程程序里,还有第三种数据类型:线程数据(TSD: Thread-Specific Data)。它和全局变量在线程内部,各个函数可以使用全局变量一样调用它,但它对线程外部的其它线程是不可见的

我们为每个线程数据创建一个键,它和这个键相关联,在各个线程里,都使用这个键来指代线程数据,但在不同的线程里,这个代表的数据是不同的,在同一个线程里,它代表同样的数据内容

和线程数据相关的函数主要有4个:创建一个键;为一个键指定线程数据;从一个键读取线程数据;删除键

(1)创建键

函数原型为:extern int pthread_key_create P (pthread_key_t *key,void (*destr_function) (void *));

第一个参数为指向一个键值的指针,第二个参数指明了一个destructor函数,如果这个参数不为空,那么当每个线程结束时,系统将调用这个函数来释放绑定在这个键上的内存块。这个函数常和函数pthread_once (pthread_once_t*once_control,void (*initroutine) (void))一起使用,为了让这个键只被创建一次。函数pthread_once声明一个初始化函数,第一次调用pthread_once时它执行这个函数,以后的调用将被它忽略

´在下面的例子中,我们创建一个键,并将它和某个数据相关联。我们要定义一个函数 createWindow,这个函数定义一个图形窗口(数据类型为Fl_Window *,这是图形界面开发工具FLTK中的数据类型)。由于各个线程都会调用这个函数,所以我们使用线程数据

/*declare a key*/
pthread_key_t myWinKey;

void createWindow()
{
	F1_Window *win;
	static pthread_once_t once = PTHREAD_ONCE_INIT;
	/*call the createMyKey() function ,to create a key */
	pthread_once(&once,createMyKey);
	/* win point to a new created window*/
	win = new F1_Window(0,0,100,100,"Mywindow");
	/* set up the new win*/
	setWindow(win);
/* 将窗口指针值绑定在键myWinKey上*/
	pthread_setpecific(myWinKey,win);


}

/*The function which is createMvKey
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值