gpt4 book ai didi

qt - qnetworkaccessmanager QNetworkReply - 竞争条件?

转载 作者:行者123 更新时间:2023-12-02 15:25:01 29 4
gpt4 key购买 nike

我有一个与 QT 相关的问题。 QNetworkAccessManager::get() 返回 QNetworkReply 指针。然后我可以连接到它的完成插槽:

QNetworkReply* r = nam->get(url);
connect(r, SIGNAL(finished()),
this, SLOT(_finishedThisReply()));

这似乎是正确的处理方式,特别是,通过这种方法,您可以使用相同的 QNetworkAccessManager 对象同时发出请求。但是,我们这里没有竞争条件吗?如果在完成 get 和调用 connect 之间已发送完成信号怎么办?还是QT保证不会发生这种情况?我在 QT 文档中还没有找到任何有关它的信息。

最佳答案

由于您可以完全控制运行的线程中发生的情况,因此不会出现竞争条件,因为您的代码在这里运行。

当然,网络访问管理器的内部可能正在另一个线程中运行。假设QNetworkManager的实现中发生了以下情况:

Thread A: QNetworkReply* r = nam->get(url);
Thread B: emit r->finished();
Thread A: connect(r, SIGNAL(finished()), ...);

这确实是一个问题。唉,该实现还可以做其他事情:

Thread A: QNetworkReply* r = nam->get(url);
Thread B: QMetaObject::invokeMethod(r, "finished");
// equivalent to QCoreApplication::postEvent(r, new QMetaCallEvent(...))
Thread A: connect(r, SIGNAL(finished()), ...);
...

此处,在回复线程内同步发出信号。这与第一个变体形成对比,第一个变体信号是异步发出的。

最终,线程 A 的控制返回到事件循环,跨线程方法调用以 QMetaCallEvent 的形式发送到 r,发出信号。

我正在简化,但是QNetworkReply的语义是第二个正确的变体的语义。它“只是有效”。即使网络访问管理器的实现在单独的线程中运行,也不会出现竞争。

关于qt - qnetworkaccessmanager QNetworkReply - 竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24273814/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com