从Windows线程库到C++11



我想删除旧代码中线程处理方式的一些Windows依赖项,如何将这段代码转换为C++11线程样式?

MyClass运行方法:

void MyClass::run()
{
    while(true)
    {
        WaitForSingleObject(startEvent, INFINITE);
        processData();
        ResetEvent(startEvent);
        SetEvent(hEvent);
    }
}

另一类的主要更新:

{
    .
    .
    .
    WaitForSingleObject(myClassInstance.hEvent, INFINITE);
    ResetEvent(myClassInstance.hEvent);
    // Getting data processed by myClassInstance in the previous update call
    // Mem copies to myClassInstance to be used later by myClassInstance processData()
    SetEvent(myClassInstance.startEvent);
    .
    .
    .
}

您可以使用std::condition_variablebool:轻松创建事件类

class Event {
  std::condition_variable cv_;
  std::mutex mtx_;
  bool signaled_ = false;
public:
  void wait() {
    std::unique_lock<std::mutex> lock{mtx_};
    while (!signaled_) {
      cv_.wait(lock);
    }
  }
  void reset() {
    std::lock_guard<std::mutex> lock{mtx_};
    signaled_ = false;
  }
  void set() {
    {
      std::lock_guard<std::mutex> lock{mtx_};
      signaled_ = true;
    }
    cv_.notify_one();
  }
};

导致使用:

struct MyClass {
  Event start;
  Event ready;
  void processData();
  void run();
};
void MyClass::run() {
  while (true) {
    start.wait();
    processData();
    start.reset();
    ready.set();
  }
}
void main_update_in_another_class() {
  ready.wait();
  ready.reset();
  // Getting data processed by myClassInstance in the previous update call
  // Mem copies to myClassInstance to be used later by myClassInstance processData()
  start.set();
  // Do other things that don't require access to myClassInstance
}

在Coliru观看现场演示

最新更新