繁体   English   中英

如何实现单个消息的消息传递?

[英]How to implement message passing for a single message?

我已经实现了工作/任务系统。 您可以创建一个function<void, void>并将其放置在线程本地队列中,然后再将该函数包装在Fiber中。

现在,这可以正常工作,但是如果我不能返回值,那将毫无用处。 function<T, void>

这意味着我需要一种方法来传递消息。 我是这样实现的:

我有一个Cell<T> ,它可以存储变量并具有原子计数器。 我将一个function<T, void>封装在一个闭包中。 一旦函数执行完毕,它将写入cell并减少计数器。 现在,当我创建closure我必须指向一个单元格,一个在闭包内部,一个在外部。

闭包的类型为function<void, void> ,我还将其包装在光纤中并将其放入线程本地队列中。

现在,在任务系统之外,我可以检查该单元格,如果计数器已减小到0。如果有,我知道task一定已经完成,否则必须等待。 我只在任务系统之外的主线程中等待。 在任务系统内部,我可以重新安排时间。

我之前没有做过任何多用途编程,而这是我可以想象实现“消息传递”的唯一方法。

我很确定像Cell这样的东西已经被发明了,但是我不确定它的通用名称是什么。

这是实现消息传递的常用方法吗? 我的意思是“在闭包中包装一个cell然后等待完成”。

我的Cell的正确名称是什么,在线上有任何可用的实现方式吗?

有一种传递消息的方法,称为“未来”。 “未来”是一个对象,它将在将来(因此)(因此而得名)中保存一个值,您可以对其进行轮询(或等待)以获取该值。 在C ++ 11中,它以std::future的形式存在。 未来的发射方是一个promise

对于您的情况:

  1. 有人给std::function<T()>安排执行
  2. 您将此功能包装在光纤中。 在执行此操作时,实际上应该先将其包装在std::function<void()>

     std::promise<T> promise; std::future<T> future = promise.get_future(); std::function<void()> wrapped = [f, p = std::move(promise)]() { p.set_value(f()); }; // do stuff with 'wrapped' return future; 
  3. 使用返回的future,您可以等待一个值(阻塞调用),也可以对其进行轮询以了解何时完成该值。

奖励:您还可以创建一个std::future<void> ,在这种情况下,您仍然可以调用get()或对其进行轮询; 它会为完成功能发出信号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM