关于使用QThreadStorage的线程安全
About thread-safety using QThreadStorage
这是一个线程问题,我基本上是从这个问题开始使库线程安全的。我的用例如下-
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都会在主线程中存储一个指向副本的指针。请注意,只要副本只被一个线程访问,它就是一样的。
当线程在主线程的容器中分配数据时,您仍然需要一个锁。但正在进行的访问不需要任何锁。
最后,所有线程都返回到主线程,您就可以自由访问容器锁了。
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区