mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-01-14 06:10:32 +08:00
Update item39.md
This commit is contained in:
parent
1d2fdd4e79
commit
6f573676e0
@ -102,7 +102,7 @@ cv.notify_one(); //通知反应任务(第2部分)
|
||||
|
||||
一个替代方案是让反应任务通过在检测任务设置的*future*上`wait`来避免使用条件变量,互斥锁和flag。这可能听起来也是个古怪的方案。毕竟,[Item38](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/7.TheConcurrencyAPI/item38.md)中说明了*future*代表了从被调用方到(通常是异步的)调用方的通信信道的接收端,这里的检测任务和反应任务没有调用-被调用的关系。然而,[Item38](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/7.TheConcurrencyAPI/item38.md)中也说说明了发送端是个`std::promise`,接收端是个*future*的通信信道不是只能用在调用-被调用场景。这样的通信信道可以用在任何你需要从程序一个地方传递信息到另一个地方的场景。这里,我们用来在检测任务和反应任务之间传递信息,传递的信息就是感兴趣的事件已经发生。
|
||||
|
||||
方案很简单。检测任务有一个`std::promise`对象(即通信信道的写入端),反应任务有对应的*future*。当检测任务看到事件已经发生,设置`std::promise`对象(即写入到通信信道)。同时,反应任务。`wait`会锁住反应任务直到`std::promise`被设置。
|
||||
方案很简单。检测任务有一个`std::promise`对象(即通信信道的写入端),反应任务有对应的*future*。当检测任务看到事件已经发生,设置`std::promise`对象(即写入到通信信道)。同时,`wait`会阻塞住反应任务直到`std::promise`被设置。
|
||||
|
||||
现在,`std::promise`和*futures*(即`std::future`和`std::shared_future`)都是需要类型参数的模板。形参表明通过通信信道被传递的信息的类型。在这里,没有数据被传递,只需要让反应任务知道它的*future*已经被设置了。我们在`std::promise`和*future*模板中需要的东西是表明通信信道中没有数据被传递的一个类型。这个类型就是`void`。检测任务使用`std::promise<void>`,反应任务使用`std::future<void>`或者`std::shared_future<void>`。当感兴趣的事件发生时,检测任务设置`std::promise<void>`,反应任务在*future*上`wait`。尽管反应任务不从检测任务那里接收任何数据,通信信道也可以让反应任务知道,检测任务什么时候已经通过对`std::promise<void>`调用`set_value`“写入”了`void`数据。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user