Visual C++本地并行编程中的状态管理

2020-01-06 12:36:01王旭

  critical_section类型的API是非常简单的;你使用一个blocking lock方法来获取这个锁,non-blocking try_lock会试图去获取这个锁,如果它可用的话,而且unlock会释放一个锁住的critical_section。

  reader_writer_lock是有一点点的复杂。它添加了两个方法,lock_read 和try_lock_read,可以支持获取一个reader lock。Unlock方法和critical_section是一样的,而且将释放恰当的基于锁类型的锁。

  最后的同步原语是event,这是手动复位事件(即:事件保持设置直到用外部代码进行手动复位)。代码可以通过调用实例wait方法(也是支持一个可选的timeout值),等待一个单一事件被设置。当没有timeout被定义的时候,等待的时间是无限的。你可以等待多重事件,通过使用静态wait_for_multiple,它接受C-style的event pointers。wait_for_multiple方法等待一个单一事件或是所有的事件传递到方法调用。以下的代码等待这两个事件被设置:

  event* events[2];

  events[0] = new event();

  events[1] = new event();

  parallel_invoke(

  [&]{ events[0]->set(); },

  [&]{ events[1]->set(); }

  );

  bool waitForAllEvents = true;

  event::wait_for_multiple(events, 2, waitForAllEvents);