登录多线程应用程序,在构造函数中使用互斥体

2024-01-11

我一直在编写一个基于 RAII 的 C++ 方法入口/出口记录器。用法是这样的:

void Class::Method()
{
    METHOD_NAME( "Class::Method" );   // I know: I could use __FUNCTION__ instead ;<)
    …
}

记录器类:

#define METHOD_NAME(name)  TraceLogger  _traceLog(name);

TraceLogger::TraceLogger( const std::string& theContext )
{
    <lock mutex here>
    // Trace logging code here
}

TraceLogger::~TraceLogger()
{
    <lock mutex here>
    // Trace logging code here
}

问题是代码不是线程安全的。如果我在此处添加互斥体来保护代码,它是否会被正确使用,因为它将被构造然后立即在 TraceLogger 构造函数中使用?

我们是一个 Windows VS2008 商店(即没有可用的 std::mutex),并且正在使用自制的线程锁定代码。我尝试过使用这个,但似乎不起作用。

有没有标准的方法可以做到这一点?

谢谢, 保罗


使用使用工作线程类封装的基于无锁队列的结构。所有应用程序线程都会将日志字符串放入对象队列中。工作线程将扫描队列并将数据记录到文件中。使工作线程在队列为空时阻塞。

在 C++ 并发演讲 Herb Sutter 中对此进行了如下描述:

记录器采用可以记录字符串的 lambda。工作线程有一个 lambda 队列,并将串行执行 lambda。

class log 
{
  fstream f;
  worker_thread w;

  public:
   void println( /*…*/ ) 
   {
      w.send([=]{f << /*…*/ << endl;
   });}

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

登录多线程应用程序,在构造函数中使用互斥体 的相关文章

  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • getline 之后返回到文件开头

    所以我已经从文件中读取了所有行 while getline ifile line logic 其中 ifile 是 ifstream line 是字符串 我的问题是我现在想再次使用 getline 并且似乎无法返回到文件的开头 因为运行 c
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • C# 中类似图的实现

    所以我有一个对象 我们称之为 Head 它有一个对象列表 C C1 C2 C3 T T1 T2 和 M M1 M2 并且所有这些都是相互关联的 例如 Head gt C1 C2 C3 T1 T2 M1 M2 T1 gt C1 C2 T2 g
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • std::make_pair 与浮点数组(float2,无符号整数)

    我有一个用 float2 unsigned int 对模板化的向量 例如 std vector
  • 原子存储抛出错误

    我最近升级到了 C 11 兼容编译器 并且尝试将一些代码从 boost 更新到 c 11 标准 我在使用atomic store转换一些代码时遇到了问题 这是一些简单的测试代码 似乎会引发编译器错误 int main std shared
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 模板与非模板类,跨编译器的不同行为

    我在一些应用程序中使用编译时计数器 它确实很有用 昨天我想用 gcc 编译一个程序 我之前使用的是 msvc 并且计数器的行为在模板类中发生了变化 它在模板类中不再工作 过于简化的代码 Maximum value the counter c
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 本地时间的内存需要释放吗?

    void log time t current time 0 tm ptm localtime current stuf 只是想确定 我是否需要在方法结束时释放 tm 指针分配的内存 不 你不应该释放它 该结构是静态分配的 检查文档 htt
  • 如何禁用基于 ValidationRule 类的按钮?

    如何禁用基于 ValidationRule 类的 WPF 按钮 下面的代码可以很好地突出显示 TextBox
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有

随机推荐

  • 无法使用 mongodb+srv 将 Mongo shell 连接到 Mongo Atlas M0

    我正在尝试通过以下方式连接到我的 MongoDB Atlas Cloud 集群mongo srv像这样连接 mongo mongodb srv cluster0 mhzdc mongodb net test username myuser
  • 自动筛选 Excel VBA 后删除隐藏/不可见行

    我想这很简单 但由于某种原因 它似乎对我不起作用 我有以下代码 它根据我指定的条件自动过滤数据 Dim lastrow As Long lastrow Sheet2 Cells Sheet2 Rows Count A End xlUp Ro
  • 在 TypeScript 中调用泛型类的静态函数

    给定一个泛型类Foo
  • 如何使用 PHP 打开新的 CMD 窗口

    在过去的几天里 我正在用 PHP 编写一些代码来弹出一个CMD窗户和这个CMDwindows有一个像 ping google com 并处理它我不需要 PHP 代码来读取结果 我只希望它运行它 我尝试过类似的东西
  • 如何在 Javascript 中比较日期?

    我有以下情况 我有一个运行循环并执行某些操作的函数 错误条件可能会使其退出该循环 我希望能够检查循环是否仍在运行 为此 我正在为每个循环运行执行以下操作 LastTimeIDidTheLoop new Date 在另一个每 30 秒运行一次
  • IIS 8.5应用程序初始化和Windows身份验证

    我正在尝试使用 IIS 8 5 上的应用程序初始化模块来预热 Intranet 应用程序 设置正确并且预热有效 但是一旦我禁用匿名身份验证 应用程序就不再预加载 内存使用量仅为 20mb 而初始化访问站点时内存使用量约为 200mb 由于这
  • Node.js:高效读取一系列行

    我目前正在使用 Node js 并且想知道如何从大型文本文件中读取一系列行 一个明显的解决方案如下所示 var fs require fs fs readFile file function err data var lines data
  • Javascript 数字和货币本地化 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我在 JavaScript 中遇到了数字和货币本地化问题 我需要的是一个方便的library为了那个原
  • Spark BlockManager 在本地主机上运行

    我有一个简单的脚本文件 我试图在模仿教程的 Spark Shell 中执行here https spark apache org examples html import org apache spark SparkConf import
  • 为什么要用“FragmentDefinition”包装“Dialog”?

    UI5 对话框可以直接定义为Dialog
  • Gmail、Yahoo、Facebook、Twitter 联系人 PHP 中的导入器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • iOS:在后台更新媒体信息

    我目前在我的应用程序中使用 MPNowPlayingInfoCenter 来显示正在播放哪首歌曲 但我希望将 HTTP Live Streaming 合并到我的应用程序中 该应用程序将在后台出现任意数量的不同曲目 有没有办法在应用程序处于后
  • 使用第三方库

    我想集成一个Timeline http visjs org docs timeline 在我的镀铬扩展中 我已经下载了这个插件的js文件和css文件 并将它们放在我的chrome扩展的根目录中 chrome 扩展本身只是向现有页面注入JS并
  • Hibernate 中 load() 与 get() 相比有何优势?

    谁能告诉我有什么好处load vs get 在休眠状态下 这些方法的语义解释并不能解释它们之间的实际差异 实际规则如下 Use get 当你想加载一个对象时 Use load 当您需要获取对象的引用而不发出额外的 SQL 查询时 例如 创建
  • 将单独的日志级别记录到 log4j2 属性文件中的单独文件

    有什么办法可以为不同的日志级别创建单独的日志文件吗 我想要的只是记录error记录到一个文件并info记录到另一个文件 我没有找到任何解决方案来做到这一点log4j2 properties 这里是log4j2 xml我得到了并且效果很好 谁
  • 如何在vim中在新窗口中打开新文件

    有没有办法在新的 shell 窗口或选项卡中打开 vim 我习惯做 mate file 这会在新窗口中打开文件 我更喜欢有一个 中央外壳 我可以根据需要在其他窗口或选项卡中发出命令并编辑文件 人们通常如何在本地打开 vim 文件 从 vim
  • 如何使用 Google App Engine Blobstore 保存网页图像

    UPDATE 这个问题最初是在不支持编程文件创建 例如通过 url 的情况下提出的 这已经改变了 请参阅 http code google com appengine docs java blobstore overview html Wr
  • 电容器推送通知和 FCM 生成不同的令牌,导致 android 崩溃

    带有 Capacitor 推送通知和 FCM 插件的 Ionic 5 应用程序 import FCM from capacitor community fcm import ActionPerformed PushNotificationS
  • 厨师从模板和刀搜索中创建逗号分隔的字符串

    我正在尝试从 Knife 查询创建动态创建的以逗号分隔的 Splunk 索引器列表 数据端口附加到每个主机名 该查询将返回的主机列表提供给模板和相应的 erb 然而 尽管当我聚合到测试 Docker 实例时没有抛出任何错误 但 conf 文
  • 登录多线程应用程序,在构造函数中使用互斥体

    我一直在编写一个基于 RAII 的 C 方法入口 出口记录器 用法是这样的 void Class Method METHOD NAME Class Method I know I could use FUNCTION instead lt