pthread_key_t和pthread_once_t?
题
与并行线程开始,我不明白什么是业务pthread_key_t和pthread_once_t?
会有人用简单的术语与实施例中,如果可能的话?解释
感谢
解决方案
没有,它不能在外行来解释。外行不能成功地与C ++并行线程编程。它需要被称为“计算机程序员”专家: - )
pthread_once_t
是存储该pthread_once
必须按顺序访问,以确保它做什么它在锡说一点点。每一次控制将允许一个init程序被调用一次,只有一次,无论多少次,它是从多少个线程调用,可能同时进行。通常情况下,你使用一次控制不同的每个对象你打算在初始化一个线程安全的方式的需求。您可以在一个线程是否已经被选做初始化这是原子访问为标志的整数效果想到它。但由于pthread_once
阻止,我想没有允许更有点比,如果实现可以在同步原语太(我曾经实施pthread_once
唯一一次补习班,我不能,所以一旦控制了任何的3种状态(启动,初始化,完成)。但后来我改变不了内核。不寻常的情况)。
pthread_key_t
就像访问线程局部存储器中的索引。你可以把每个线程的具有从键映射到值。当您添加新条目TLS,pthread_key_create
选择一个键,并写道,钥匙插入您指定的位置。然后,使用该密钥从任何线程,只要你想设置或检索TLS项目的价值为当前线程。究其原因TLS为您提供了一个重要的,而不是让你选择一个,就是让不相关的库可以使用TLS,而不必合作,以避免使用相同的值,并捣毁对方的TLS数据两者。 pthread库可能例如保持一个全局计数器,并分配用于在第一时间pthread_key_create
键0被调用时,1为第二,等等。
其他提示
pthread_key_t
是创建线程线程本地存储:每个线程都有自己的副本的一个数据变量,而不是所有线程共享的全局(或功能静电,类静态)变量。该TLS是由一个关键索引。请参阅 pthread_getspecific
等人的更多细节。
pthread_once_t
是用于与 pthread_once
执行功能仅一次的控制。假设你要调用初始化程序,但你只能调用子程序一次。此外,在这你必须把它叫做点后,你已经开始了多线程。要做到这一点的方法之一是使用pthread_once()
,这保证了你的日常才会被调用一次,无论多少线程试图同时调用它,只要您使用相同的控制变量在每次调用。它往往更容易使用pthread_once()
比它是使用其他的替代品。
哇,这里其他的答案是太冗长。
pthread_once_t
存储状态为pthread_once()
。调用pthread_once(&s, fn)
调用fn
,并将其值指向s
记录它已被执行的事实。到pthread_once()
所有后续调用是noops。这个名字现在应该变得明显。
pthread_once_t
应该初始化为PTHREAD_ONCE_INIT
。