关于使用QThreadStorage的线程安全性

时间:2011-06-23 02:21:25

标签: c++ c multithreading qt thread-safety

这是一个线程问题,我基本上开始使库线程安全。我的用例如下 -

struct <>
    {

      int thread_specific_value;
}

1)例如旋转5个线程。

2)例如,每个线程执行操作并将thread_specific_value存储在上述数据结构中。这是在每个线程的初始化时动态分配的,并添加到QThreadStorage。

3)一旦所有线程都返回主线程,我想访问所有线程的errno值并进行一些处理。在从主线程中删除线程之前,我是否可以获取其存储数据的信息并存储在主线程的特定存储中。

简而言之,我如何遍历所有线程特定存储数据的QThreadStorage并从主线程进行一些处理?

2 个答案:

答案 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在主线程中存储一个指向副本的指针。请注意,只要该副本只能由一个线程访问,就一样。

当线程在主线程的容器中分配数据时,您仍然需要一个锁。但是正在进行的访问不需要任何锁定。

最后,所有线程返回主线程,您可以免费访问容器锁。