我实现了一个工作/任务系统。您可以创建一个 function<void, void>
并将它放在线程本地队列中,然后我将函数包装在 Fiber 中。
现在它现在工作得很好,但如果我不能返回值,那将毫无用处。 function<T, void>
这意味着我需要一种方法来进行消息传递。我是这样实现的:
我有一个 Cell<T>
它可以存储一个变量并有一个原子计数器。我拿 function<T, void>
, 包裹在一个封闭中。函数执行后,它将写入 cell
。并递减计数器。现在,当我创建 closure
我必须指向一个单元格,一个在闭包内,一个在外。
闭包类型为 function<void, void>
我还将它包裹在纤程中并将其放入线程本地队列中。
现在在任务系统之外,我可以检查该单元格是否计数器已递减到 0。如果是,我知道 task
必须完成,否则我必须等待。我只在任务系统之外的主线程中等待。在任务系统中,我可以重新安排时间。
我以前没有做过任何多线程编程,这是我能想到的实现“消息传递”的唯一方法。
我很确定像我的 Cell
已经被发明出来了,但我不确定它的通用名称是什么。
这是实现消息传递的常用方法吗?我的意思是“将 cell
包装在闭包中并等待完成”。
我的 Cell
的正确名称是什么?是否有任何在线可用的实现?
最佳答案
有一种方法可以传递一个消息,它被称为“ future ”。 “ future ”是一个对象,它将在(不久的) future (因此得名)持有一个值,您可以轮询(或等待)它以获得该值。在C++11中,它以 std::future
的形式存在. future 的发射端是 promise
.
针对您的情况:
- 有人给出
std::function<T()>
被安排执行 您将此函数包装在纤程中。在执行此操作时,您实际上应该将其包装在
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;
对于返回的 future ,您可以等待值(阻塞调用)或轮询它以了解值何时完成。
奖励:您还可以创建 std::future<void>
,在这种情况下您仍然可以调用 get()
或仍然投票;它将作为功能完成的信号。
关于c++ - 如何实现单个消息的消息传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37762771/