关于使用QThreadStorage的线程安全

About thread-safety using QThreadStorage

本文关键字:线程 安全 QThreadStorage 于使用      更新时间:2023-10-16

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

struct <>
    {
      int thread_specific_value;
}

1) 例如,旋转5个螺纹。

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

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

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

存储在QThreadStorage中的数据只能从放置它的线程访问。时期如果您想从其他线程访问相同的数据,则必须将其额外存储在其他地方。特别是,线程特定的值在线程退出时被破坏;如果要保留该值,请在线程退出之前将其保存在某个位置。

简而言之,不要尝试使用QThreadStorage进行线程间通信。这不是它的目的。

很抱歉回答一个解决了9年多的问题。我正在为类似的问题寻找解决方案,这句话的灵感来自@bdonlan:的公认答案

If you want to access the same data from other threads, you must store it additionally elsewhere.

因此,您可以将唯一的副本存储在其他位置,而不是存储在其他地方,即在主线程中,收集容器中不同线程的所有副本(列表或映射,但不是std::vector或QVector)。然后,在每个线程中,QThreadStorage都会在主线程中存储一个指向副本的指针。请注意,只要副本只被一个线程访问,它就是一样的。

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

最后,所有线程都返回到主线程,您就可以自由访问容器锁了。