【问题标题】:Suspending/Resuming an Async Process with std::thread使用 std::thread 暂停/恢复异步进程
【发布时间】:2017-03-11 00:57:44
【问题描述】:

让我们假设存在以下类:


class MySession {
 public:
    run(); // can only be invoked once, starts a child _run() process as an async process
    suspend();
    resume();
 private:
    // basic implementation
    run_() {
       while(condition) {
         runMyDefaultOperation();
         // either waits for interval, or if suspended, waits until resume is called 
         waitFor(interval); 
       }
    }
};

这工作得很好,但它在可扩展性方面受到限制。这种实现限制了我在“块”中暂停。为了解决这个问题,我需要检查is_suspended 状态以获取任意更小的代码块。

这种设计模式是否可以接受,或者我应该使用另一种设计模式来代替这样的任务?

【问题讨论】:

  • 检查game loop 模式,它主要适用于游戏和其他实时应用程序。逻辑是,为了避免在不同硬件上的不同体验,计算先前操作(在游戏上渲染一帧)的处理时间,如果计算机太快,这意味着它会非常快地处理它,因此将其暂停一段时间,如果硬件项目按时完成,则无需任何等待即可通过,因此无论硬件功率如何,它们都会对齐
  • 纺纱,即使等待,通常也是一个坏主意。不总是。您正在执行的此类操作的最佳模式最终对您正在做的事情敏感 - 您正在“旋转”什么。你已经抽象出了关于你正在“旋转”的所有细节。这使得回答你的问题成为一种读心术。现在,人们在读心方面出奇地好,但这仍然是在浪费人们回答你问题的时间。
  • 我在内部所做的实际上与我的情况无关。调用不受MySession 拥有的任何数据影响的函数。我确实离开了间隔,这将是 1-10 分钟以上。
  • Yakk:问题中没有明确的旋转,条件变量会起作用,请参阅我的答案。

标签: c++ multithreading c++11 c++14


【解决方案1】:

我想说这种设计模式是可以接受的,而且是可扩展的:这里的可扩展性方法是将 Session 的工作分成更小的块,所以 runMyDefaultOperation() 每次都会执行一小块代码。

您可以在一定程度上使用command pattern 来帮助组织工作。

附带说明一下,实现suspendresumewait 的合适机制是condition variable

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多