|
9
|
| Adam Holmberg · 技术社区 · 16 年前 |
|
|
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中的所有读/写调用执行此操作。 |
|
Ben · 统计向量中的单词在字符串中出现的频率 9 月前 |
|
Haru Hoshizora · 为什么一个整数的位置没有改变,但值却不同 11 月前 |
|
|
bear_525 · 从列中删除中间名和首字母,并保存在单独的列中 11 月前 |
|
|
asdfadf · 为什么具有相同内存值的字符串和整数打印方式不同? 11 月前 |
|
|
user764754 · 防止多行原始字符串文字中出现新行字符 11 月前 |
|
|
Bogaso · 从列表中返回与模式匹配的元素 11 月前 |
|
|
Jasco · 如何使用VBA提取两个相似字符之间的字符串中的单词? 12 月前 |