【问题标题】:What is a thread-safe way to break out of a POCO::HTTPSClientSession::receiveResponse?打破 POCO::HTTPSClientSession::receiveResponse 的线程安全方法是什么?
【发布时间】:2014-09-29 13:18:25
【问题描述】:

receiveResponse 调用被阻塞,当我在单独的线程上运行代码时,我希望能够随时干净地停止线程。文档显示 abort() 可能是我需要的,但我找不到任何信息表明它是否是线程安全的。 谢谢,

【问题讨论】:

    标签: c++ multithreading networking poco-libraries


    【解决方案1】:

    HTTPSClientSession::abort() 在套接字上调用 shutdown();这应该会导致receiveResponse() 返回(更正:到throw)。

    HTTP(S)ClientSession 没有内部锁定,但这里的线程安全并不是真正与 Poco 相关的问题。如果在您的平台/堆栈的 recv() 上阻塞的套接字上调用 shutdown() 是安全的,那么一切都很好。

    【讨论】:

    • 您能否解释一下您的意思是“这里的线程安全并不是真正与 Poco 相关的问题”?我无权访问 POCO 源,因此我无法准确说明在接收响应期间和调用中止/关闭时发生了什么。此外,我不确定如何知道在 recv 上阻塞的套接字上调用 shutdown 是否安全 - 什么时候不安全?
    • 每个人都可以访问 Poco 源,请参阅 github.com/pocoproject/poco 。至于在阻塞的套接字上调用 shutdown 是否安全,这确实不是 Poco 的问题,因为 Poco 没有实现套接字,而只是将它们包装起来,以及 recv() 和 shutdown() 如何交互可能是特定于平台的(平台上没有信息在问题中)。答案解释了“幕后”发生的事情。参见例如这些答案:fixunix.com/unix/…fixunix.com/unix/…
    • @Alex 它应该由于过早的 EOS 而导致抛出,而不是因为您链接到的代码似乎实现了网络异常。 abort() 会关闭输入吗?它是在哪里定义的?
    • 至于shutdown(),进出都关闭;还有单独的 shutdownSend() 和 shutdownReceive() 函数。 Socket::shutdown() 在这里定义:github.com/pocoproject/poco/blob/develop/Net/src/…
    猜你喜欢
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多