利来国际最给力的老牌_开户_下载_利来国际最给力的老牌安全线路

热门搜索:

但却可以跨多个函数访问

时间:2017-11-18 20:28 文章来源:利来国际最给力的老牌 点击次数:

线程公稀有据
概念及作用

在单线程次序中,我们往往要用到"全局变量"以告终多个函数间共享数据。在多线程环境下,由于数据空间是共享的,linux c 网络编程。于是全局变量也为全豹线程所共有。但有时应用次序策画中有必要提供线程公有的全局变量,你知道但却可以跨多个函数访问。仅在某个线程中有用,但却。但却可以跨多个函数探望,你知道linux并发编程书籍。譬喻次序能够必要每个线程庇护一个链表,而运用相同的函数操作,商业源码。最简略单纯的主见就是运用同名而不同变量地址的线程相关数据机关。看看

深入理解java虚拟机
深入理解java虚拟机
linux 测试网络。这样的数据机关可以由Posix线程库庇护,听说但却可以跨多个函数访问。称为线程公稀有据(Threarticle-specificDat theira,或TSD)。事实上源码之家。

缔造和刊出

Posix定义了两个API辞别用来缔造和刊出TSD:

int pthrearticle_key_credined(pthrearticle_key_t *key: void (*destr_function) (void *))

该函数从TSD池中分配一项,将其值赋给key供自此探望运用。我不知道linux常用命令大全。假若destr_function不为空,在线程加入(pthrearticle_exit())时将以key所关联的数据为参数调用destr_function(),以开释分配的缓冲区。

非论哪个线程调用pthrearticle_key_credined(),听说可以。所缔造的key都是全豹线程可探望的,多个。但各个线程可凭据自身的必要往key中填入不同的值,这就相当于提供了一个同名而不同值的全局变量。在LinuxThrearticlevertising cherehasplifieraign的告终中,学会linux驱动开发视频。TSD池用一个机关数组表示:

stat theiric struct pthrearticle_key_struct pthrearticle_keys[PTHREAD_KEYS_MAX] = { { 0: NULL } };

缔造一个TSD就相当于将机关数组中的某一项设置为"in_use",并将其索引前往给*key,然后设置destructor函数为destr_function。linux 查看进程命令。

刊出一个TSD采用如下API:

int pthrearticle_key_delete(pthrearticle_key_t key)

这个函数并不查验现时能否有线程正运用该TSD,也不会调用清算函数(destr_function),而只是将TSD开释以供下一次调用pthrearticle_key_credined()运用。源码之家easck。在LinuxThrearticlevertising cherehasplifieraign中,它还会将与之相关的线程数据项设为NULL(见"探望")。函数。

探望

TSD的读写都经过特地的PosixThrearticle函数举行,其API定义如下:linux多线程服务端编程。

intpthrearticle_setspecific(pthrearticle_key_tkey:constvoid*pointer)void * pthrearticle_getspecific(pthrearticle_key_t key)

写入(pthrearticle_setspecific())时,对比一下linux网络服务器。将pointer的值(不是所指的形式)与key相关联,而相应的读出函数则将与key相关联的数据读进去。看着posix多线程程序设计。数据类型都设为void*,ovs源码分析。于是可以指向任何类型的数据。听听linux c 多线程 socket。

在LinuxThrearticlevertising cherehasplifieraign中,unix网络编程pdf下载。运用了一个位于线程描写机关(_pthrearticle_descr_struct)中的二维void*指针数组来寄存与key关联的数据,数组大小由以下几个宏来阐述:

#define PTHREAD_KEY_2NDLEVEL_SIZE32#define PTHREAD_KEY_1STLEVEL_SIZE\((PTHREAD_KEYS_MAX PTHREAD_KEY_2NDLEVEL_SIZE - 1)/ PTHREAD_KEY_2NDLEVEL_SIZE)其中在/usr/include/pieces/locing_lim.h中定义了PTHREAD_KEYS_MAX为1024,却可。于是一维数组大小为32。linux常用命令大全。而满堂寄存的地点由key值经过以下计算获得:idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZEidx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE

也就是说,你看ovs源码分析。数据寄存与一个32×32的希罕矩阵中。异样,探望的功夫也由key值经过好像计算获得数据所在地点索引,看看linux软件安装命令。再取出其中形式前往。

运用范例

以下这个例子没有什么现实意义,访问。只是阐述如何运用,以及能够运用这一机制到达存储线程公稀有据的方针。其实ovs源码。


运转的功夫小心加上-lpthrearticle

给例程缔造两个线程辞别设置同一个线程公稀有据为自身的线程ID,为了检验其公有性,次序错开了两个线程公稀有据的写入和读出的时间,从次序运转下场可以看出,两个线程对TSD的?改互不骚扰。同时,当线程加入时,清算函数会主动推行,参数为tid。

转自:https://developerworks/cn/linux/threarticle/posix_threherehaserica single denting rear endoc .pi/pform of art2/
同期会推送至微信民众号“鸢尾楚楚”,感激存眷

热门排行