这是一个线程问题,我基本上开始使库线程安全。我的用例如下 -
struct <>
{
int thread_specific_value;
}
1)例如旋转5个线程。
2)例如,每个线程执行操作并将thread_specific_value存储在上述数据结构中。这是在每个线程的初始化时动态分配的,并添加到QThreadStorage。
3)一旦所有线程都返回主线程,我想访问所有线程的errno值并进行一些处理。在从主线程中删除线程之前,我是否可以获取其存储数据的信息并存储在主线程的特定存储中。
简而言之,我如何遍历所有线程特定存储数据的QThreadStorage并从主线程进行一些处理?
答案 0 :(得分:3)
存储在QThreadStorage中的数据只能从放在那里的线程访问。期。如果要从其他线程访问相同的数据,则必须将其另外存储在其他位置。特别是,特定于线程的值在线程退出时被销毁;如果你想保留这个值,请在线程退出之前保存它。
简而言之,不要尝试使用QThreadStorage进行线程间通信。这不是它的用途。
答案 1 :(得分:0)
很抱歉回答已解决9年以上的问题。我正在寻找类似问题的解决方案,而我的灵感来自@bdonlan接受的答案中的这句话:
If you want to access the same data from other threads, you must store it additionally elsewhere.
因此,您可以将唯一的副本存储在其他位置(即在主线程中),而不是将副本存储在其他位置,即在容器(列表或映射,而不是std :: vector或容器)中收集不同线程的所有副本。 QVector)。然后,在每个线程中,QThreadStorage在主线程中存储一个指向副本的指针。请注意,只要该副本只能由一个线程访问,就一样。
当线程在主线程的容器中分配数据时,您仍然需要一个锁。但是正在进行的访问不需要任何锁定。
最后,所有线程返回主线程,您可以免费访问容器锁。