一个非常基础的问题。文档提到
QNetworkAccessManager
中的所有方法都是可重入的。如果是这样,那么在QRunnable
中执行get()
方法而不使用锁是否合法?我的代码看起来像这样:class MyClass: public QRunnable
{
void run()
{
...
QNetworkAccessManager nam;
QNetworkReply* reply = name.get(request) // No Read-write lock.
...
}
};
QMutex
来串行访问它,但是:QNetworkAccessManager
是一个QObject
,因此需要通过moveToThread()
将其移动到线程中以安全地调用它,即使有互斥保护(事件处理程序可能在任何时候调用QObject
)。由于QRunnable
在无法从外部QThreadPool
预测的线程上运行,并且moveToThread()
只能将对象推送到另一个线程中,而不能从另一个线程中拉取,因此您不能在未在其中创建QRunnable
的QObject
中使用它们(除非您在内部对它们进行同步,即使它们是线程安全的)。 - Marc Mutz - mmutzQNetworkAccessManager
,那么为所有的管理器设置缓存和代理设置就会变得困难。 - philk