该文档称QList是可重入的。 那么对于下面的代码是线程安全吗?
//worker thread
...
if(myList.size() == 0)
{
...
}
//main thread
foreach(QImage, myList)
{
...
}
所有......部分与myList无关。 两个线程中的myList对象是同一个对象。 这个线程安全吗?
答案 0 :(得分:2)
如果myList是const,因此所有访问都是只读的,这是线程安全的。
但是如果至少有一个线程代码在对象上进行非const访问,那么这不是线程安全的。
为了确保您正在执行只读操作,请在myList上声明一个const引用,并在并发代码中仅使用此引用:
const QList<QImage> & constMyList = myList;
这与重入无关。 Reentrancy告诉您,如果您分别在两个不同的线程中对两个不同的QList实例进行操作(读取或写入),则会定义行为。
例如,非重入类可以在非静态方法中使用静态函数/成员。如果没有保护这些静态函数/成员,则类方法将不可重入:即使在处理两个独立对象时,行为也可能未定义。
但是,Qt doc告诉您,对容器的只读操作是线程安全的。这就是你要找的东西。