小编Ion*_*rel的帖子

condition_variable的常见用例场景

条件变量可用于向其他线程发出已发生事件的信号:

mutex m;
condition_variable cv;

thread t1([&cv]{
    // processing
    ...
    cv.notify_one();
});
...
unique_lock<std::mutex> lck(m);
cv.wait(lck);
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,在我们等待通知之前,有一个完成线程处理并且通知正在经过的机会窗口,因此我们将永远等待.

在这种情况下,一个常见的解决方案是使用标志:

mutex m;
condition_variable cv;
bool done = false;

thread t1([&cv,&done]{
    // processing
    ...
    done = true; 
    cv.notify_one();
});
...
unique_lock<std::mutex> lck(m);
cv.wait(lck, [&done]{return done;});
Run Code Online (Sandbox Code Playgroud)

使用标志的常用方法是使用a condition_variable,还是我的解释错了?

c++ multithreading synchronization c++11

4
推荐指数
1
解决办法
4087
查看次数

实时记录

我有一个应用程序,它有一个循环,一个"调度程序"的一部分,它一直运行,是应用程序的核心.非常像游戏循环,只是我的应用程序是WPF应用程序而且它不是游戏.当然,应用程序会在许多点上进行日志记录,但是调度程序会进行一些敏感的监视,有时候只能从日志中分辨出可能出错的地方(并且错误地我并不意味着例外)或当前状态.

由于Scheduler的内部循环以较短的间隔运行,因此您无法在其中执行基于I/O的文件记录(或使用事件查看器).首先,您需要实时观看,其次日志文件的大小会非常快.所以我在考虑如何实时向用户显示这些数据,我考虑过一些事情:

  • 在UI中实时显示数据
  • 使用AllocConsole/WriteConsole在控制台中显示此信息
  • 使用可显示此信息的其他控制台应用程序,使用管道或其他IPC技术在Scheduler和控制台应用程序之间进行通信
  • 使用Windows的性能监视器,并以某种方式提供此信息
  • ETW

在UI中显示会产生问题.首先,它没有与我为我的应用程序考虑的UI集成,我不想为此复杂化UI.这种诊断很少发生.其次,会有一些非平凡的数据保护,因为Scheduler有它自己的线程.

一个单独的控制台窗口可能会工作,但我仍然担心,如果它没有太多的门槛.分配我自己的控制台,因为这是一个Windows应用程序,可能会比不同的控制台应用程序(3)更好,因为我不需要担心IPC通信和非阻塞通信.但是,用户可以关闭我分配的控制台,在这种情况下会出现问题.通过单独的流程,您不必担心它.

假设有一个用于性能监视器的API,它不会与我的应用程序集成得太好或对用户显而易见.使用ETW也没有解决任何问题,只是一个随意的想法,我仍然需要以某种方式显示这些信息.

别人怎么想,我会错过其他方式吗?

architecture windows user-interface logging diagnostics

3
推荐指数
1
解决办法
1149
查看次数