有没有办法在 Windows 中的 basic_iostream 上获得非锁定流插入/提取?

2024-01-30

我是一名 C++ 开发人员,主要在 Solaris 和 Linux 上进行编程,直到最近我被迫创建一个针对 Windows 的应用程序。

我一直在使用基于 TCP 套接字支持的 C++ I/O 流的通信设计。该设计基于单个线程连续从流中读取(大部分时间阻塞在套接字读取等待数据中),而其他线程通过同一流发送(通过互斥体同步)。

当迁移到 Windows 时,我选择使用 boost::asio::ip::tcp::iostream 来实现套接字流。我沮丧地发现上述多线程设计在Windows上导致了死锁。看来operator<<(std::basic_ostream<...>,std::basic_string<...>)声明一个“Sentry”,它锁定输入和输出操作的整个流。由于我的读取线程始终在流上等待,因此在创建此 Sentry 时,其他线程的发送操作会死锁。

以下是operator

    ...
    ntdll.dll!7c901046()    
    CAF.exe!_Mtxlock(_RTL_CRITICAL_SECTION * _Mtx=0x00397ad0)  Line 45  C
    CAF.exe!std::_Mutex::_Lock()  Line 24 + 0xb bytes   C++
    CAF.exe!std::basic_streambuf<char,std::char_traits<char> >::_Lock()  Line 174   C++
    CAF.exe!std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...})  Line 78   C++
    CAF.exe!std::basic_ostream<char,std::char_traits<char> >::sentry::sentry(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...})  Line 95 + 0x4e bytes  C++
>   CAF.exe!std::operator<<<char,std::char_traits<char>,std::allocator<char> >(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...}, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Str="###")  Line 549 + 0xc bytes   C++
    ...

如果 istream 和 ostream 组件单独锁定,我会很好,但事实并非如此。

我可以使用流运算符的替代实现吗?我可以指示它不锁定吗?我应该实现自己的(不知道如何做到这一点)?

任何建议,将不胜感激。

(平台为 Windows 32 位和 64 位。使用 Visual Studio 2003 Pro 和 2008 Express 观察到的行为)


根据 boost 文档 [1],使用两个线程在没有互斥锁的情况下访问一个对象是“不安全的”。仅仅因为它可以在 Unix 平台上运行并不能保证它也可以在 Windows 平台上运行。

所以你的选择是:

  1. 重写您的代码,以便您的线程不会同时访问该对象
  2. 修补 boost 库并将更改发回
  3. 好好询问 Chris 是否愿意对 Windows 平台进行更改

[1] http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/overview/core/threads.html http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/overview/core/threads.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在 Windows 中的 basic_iostream 上获得非锁定流插入/提取? 的相关文章

  • 具有字符串类型的 CAPL 关联数组

    按照此paper https kb vector com upload 551 file CAPL 3 CANNewsletter 201411 PressArticle EN pdf 我正在尝试创建一个像这样的关联数组 variables
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 已达到网络 BIOS 命令限制

    我的 ASP Net 应用程序从另一台 Windows 服务器上的共享文件夹获取文件 当请求增加时 我收到以下错误 The network BIOS command limit has been reached 我已按照以下步骤操作微软 K
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • Tkinter - 浮动窗口 - 调整大小

    灵感来自this https stackoverflow com a 22424245 13629335问题 我想为我的根窗口编写自己的调整大小函数 但我刚刚注意到我的代码显示了一些性能问题 如果你快速调整它的大小 你会发现窗口没有像我希望
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • 如何绕过指定“Host”标头来访问 Ingress 控制器指向的服务?

    我的入口控制器正在工作 我可以使用以下命令访问集群外部的服务http externalIP path使用来自 RestClient 的 HTTP GET 请求 但是 我必须指定 Host 标头与value host 我的 Ingress 资
  • 如何使用 CSS 设置代码列表样式?

    我想使用 CSS 在 HTML 文档中显示编程语言代码片段以及 HTML 代码 我希望它缩进并采用固定宽度的字体 我正在考虑类似的事情 blockquote my code here my code here also blockquote
  • 在 TFS 项目中查找标签

    我目前正在使用以下代码通过指定标签查找 tfs 项目内的分支 TfsTeamProjectCollection tfs new TfsTeamProjectCollection new Uri tfsuri var vcs tfs GetS
  • 如何更改 Subclipse 中的用户凭据?

    我正在使用 Subclipse Eclipse 中的 Subversion 集成 我现在想更改 subclipse 中的用户凭据 我怎么做 即使用另一个用户帐户登录 Subversion 删除或重命名 Eclipse 配置文件夹中的 Ecl
  • 如何在JavaFX中使用CSS制作动画?

    我想改变风格Node通过更改其样式类别 Button button new Button button getStyleClass add class1 button setOnMouseClicked new EventHandler
  • 如何获取我的IP地址? [复制]

    这个问题在这里已经有答案了 我有一个 serverSocket 我想知道 IP 地址 但是 listenSocket getInetAddress toString I get 0 0 0 0 如何获取 IP 地址或 如果启用了两个连接 其
  • NodeJS 读取/写入文件到网络驱动器

    我有一个使用 fs createWriteStream 将文件写入磁盘的脚本 我现在想要实现的目标是将这些文件写入共享网络驱动器 目录如下 hostname scratch reece 我在 Windows 上运行这个脚本 但是当我部署它时
  • Twitter API - 注销

    我在我的网络应用程序中使用 OAuth 用户可以使用 twitter 登录 我想添加 切换 twitter 帐户 按钮 该按钮实际上会清除会话 然后打开authorize url 由于清除我的网络应用程序中的会话不会注销 twitter 因
  • 如何仅将 jquery 应用于移动设备?

    我只需要为移动浏览器应用以下 jquery 这是为了重新排序引导列的位置 我该怎么做呢 需要用什么东西包裹起来吗 总是很难检测到它是移动设备的浏览器还是带有触摸屏的笔记本电脑 因此 不要检测它 如果您担心屏幕尺寸 那么我会建议您检测屏幕尺寸
  • 如果没有有效的选择,如何返回到第一个 if 语句

    如果没有正确满足条件 如何让 Python 移动到 if 语句的顶部 我有一个基本的 if else 语句 如下所示 print pick a number 1 or 2 a int raw input gt if a 1 print th
  • 从鼠标坐标到 3d 的点-三角形相交?

    我知道如何测试点和三角形之间的交点 但是我不明白 如何使用鼠标坐标将点的起始位置精确地移动到屏幕平面上 因此点角度应该根据鼠标光标在屏幕上的位置而变化 这也应该起作用完美的是 无论我在 OpenGL 应用程序中使用哪个透视角度 因此不同透视
  • 如何删除fiddler安装的根CA证书

    Fiddler 有助于添加唯一的根 CA 证书来拦截 HTTPS 流量 添加此证书后 如何删除它 两种方式之一 1 禁用 HTTPS 解密并单击标题为 删除拦截证书 的按钮 2 打开 CertMgr msc 打开个人和受信任存储 然后使用根
  • 以编程方式复制 WPF 控件

    我有一个选项卡控件 当用户想要添加到它时 我想复制几个已经存在的元素 而不仅仅是引用它们 现在 到目前为止我只是硬复制了我想要的变量 但我在自动调整大小代码中出现了裁剪器 也就是说 在调整窗口大小时 复制的元素明显落后于原始元素 此外 随着
  • HTML5 视频暂停时显示海报图像或暂停按钮?

    您好 我正在为 iPad 编写一个本地网站 并且有一个没有控件的视频 点击时会播放和暂停 视频暂停时能否显示海报图片 或者在中间显示一个暂停按钮 这是我用于播放和暂停的代码
  • Pandas - Groupby 数据帧存储为数据帧而不聚合

    我是 Pandas 的新手 我在这里阅读了很多文档 帖子和答案 但我一直无法辨别出实现我的目标的好策略 抱歉 如果它已经得到解答 我找不到它 这是我所拥有的 df key A B A B value 2 2 1 1 df pd DataFr
  • Django 有办法打开 HTTP 长轮询连接吗?

    保持连接打开 直到事件发生 看一下姜戈 彗星 推 万恶之中最小的 https stackoverflow com questions 4310706 django comet push least of all evils or Pytho
  • 如何在 Android 上使用带有 c 和 java api 的库项目

    我在谷歌 android ndk 组中问过这个问题 但没有得到任何答案 我正在尝试通过单击在独立项目中构建通用模块 是图书馆 是日食 该项目同时提供c api 和java api 虽然其中一些 api 是相关的 这意味着将它们分开不是一个好
  • 如何简单地将数据帧的两列相乘? [复制]

    这个问题在这里已经有答案了 我的输入是 a lt c 1 2 3 4 b lt c 1 2 4 8 df lt data frame cbind a b 我的输出应该是 a lt c 1 2 3 4 b lt c 1 2 4 8 d lt
  • 在 Visual Studio 本地使用假域名,无需直接修改主机文件

    我有一个在这里运行的应用程序http 本地主机 10205 http localhost 10205 但我需要它在本地运行http somethingelse com http somethingelse com 这也需要在其他计算机上进行
  • 有没有办法在 Windows 中的 basic_iostream 上获得非锁定流插入/提取?

    我是一名 C 开发人员 主要在 Solaris 和 Linux 上进行编程 直到最近我被迫创建一个针对 Windows 的应用程序 我一直在使用基于 TCP 套接字支持的 C I O 流的通信设计 该设计基于单个线程连续从流中读取 大部分时