9
|
Adam Holmberg · 技术社区 · 15 年前 |
1
1
根据Boost文档[1],使用两个线程访问一个对象而不使用互斥是“不安全的”。仅仅因为它在Unix平台上工作,并不能保证它在Windows平台上工作。 所以你的选择是:
〔1〕 http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/overview/core/threads.html |
2
1
这个问题已经拖得够久了。我要报告我最后做了什么,尽管有可能我会被嘲笑。 我已经确定了问题是,当试图在单独的读写操作中访问iostream对象时,两个线程出现了死锁。我可以看到,字符串流插入和提取运算符的Visual Studio实现都声明了一个Sentry,它锁定了与正在操作的流相关联的流缓冲区。 我知道,对于这个死锁的相关流,流缓冲区实现是boost::asio::basic_socket_streambuf。我检查了实现,以查看读写操作(下溢和溢出)实际上在不同的缓冲区(get和put)上运行。 经过以上验证,我选择简单地绕过这个应用程序的锁定。为此,我使用了特定于项目的预处理器定义来排除锁定岗哨的基本\u istream实现中的锁定代码:
上攻:
下降趋势:
我计划通过在代码和项目文档中大声记录这一点来缓和后一点。 我意识到这可能有一个更优雅的解决方案,但为了方便起见,我在尽职调查后选择了一个直接的解决方案来理解影响。 |
3
0
也许您可以自己实现一个锁层?也就是说,有一个单独的
|
4
0
在写入流之后是否显式地刷新了它?
This blog post
意味着您的数据可能只是“卡”在缓冲区中。如果这是真的,那么也许你看起来像死锁了,因为还没有什么可供阅读的。添加
博客文章建议的另一种(尽管效率较低)解决方案是关闭流的输出缓冲:
|
5
0
我知道这是个老问题…但我必须自己做! 我的情况更复杂,因为这是我自己的streambuf,但您可以通过执行以下操作来解决此问题:
它会优先调用std::version。 当然,您必须为每个调用lock的Windows操作员以及(在我的情况下)您的streambuf中的所有读/写调用执行此操作。 |
mig21 bis · 带套接字的SSL_set_fd地址边界错误 2 年前 |
hollow · 在读写C中的套接字时,为什么要使用循环缓冲区? 2 年前 |
Filipe · 通过http python发送图像 6 年前 |
Mr. Rogers · epoll_wait事件的epoll顺序 6 年前 |
Michael Beer · 查找插座的传输类型 6 年前 |