pthread_key_t和pthread_once_t?

veh*_*zzz 3 c++ unix pthreads

从pthreads开始,我无法理解pthread_key_t和pthread_once_t的业务是什么?

如果可能,有人会用简单的例子解释一下例子吗?

谢谢

Ada*_*eld 13

pthread_key_t用于创建线程线程本地存储:每个线程获取自己的数据变量副本,而不是共享全局(或函数静态,类 - 静态)变量的所有线程.TLS由密钥索引.有关pthread_getspecific详细信息,请参阅等.

pthread_once_t是一个只用一次执行函数的控件pthread_once.假设您必须调用初始化例程,但您必须只调用该例程一次.此外,您必须调用它的点是在您已启动多个线程之后.实现此目的的一种方法是使用pthread_once(),这保证只要在每次调用中使用相同的控制变量,无论有多少线程尝试一次调用它,您的例程将只被调用一次.它通常pthread_once()比使用其他替代品更容易使用.


Ste*_*sop 11

不,这不能用外行术语来解释.在C++中,Laymen无法使用pthread成功编程.它需要一位称为"计算机程序员"的专家:-)

pthread_once_t是一个pthread_once必须访问的存储器,以确保它完成它在锡上所说的.每次一次控制都将允许一个init例程被调用一次,而且只调用一次,无论从多少个线程调用多少次,可能同时调用.通常,您为计划按照线程安全的方式按需初始化的每个对象使用不同的一次控件.您可以将它视为一个整数,它可以原子方式作为标志访问,无论是否已选择一个线程来执行init.但是由于pthread_once是阻塞,我想如果实现也可以填充同步原语(我唯一一次实现pthread_once,我不能,那么曾经的控制采取了3种状态中的任何一种) (开始,初始化,完成).然后我无法改变内核.不寻常的情况).

pthread_key_t就像访问线程本地存储的索引一样.您可以将每个线程视为具有从键到值的映射.向TLS添加新条目时,为其pthread_key_create选择一个密钥并将该密钥写入指定的位置.然后,只要您想为当前线程设置或检索该TLS项的值,就可以从任何线程使用该键.TLS为您提供密钥而不是让您选择密钥的原因是,不相关的库可以使用TLS,而无需合作以避免使用相同的值并且摧毁彼此的TLS数据.pthread库可以例如保持全局计数器,并且第一次分配键0,第二次分配pthread_key_create1,依此类推.