我已经实施了一个工作/任务系统。您可以创建function<void, void>
并将其放在线程本地队列中,然后将该函数包装在Fiber中。
现在这种方法完全正常,但如果我无法返回值,那将毫无用处。function<T, void>
这意味着我需要一种方法来传递消息。我这样实现了它:
我有一个Cell<T>
可以存储变量并且有一个原子计数器。我拿一个function<T, void>
,在一个封口中包裹。一旦执行了该函数,它将写入cell
并递减计数器。现在,当我创建closure
时,我必须指向一个单元格,一个在闭包内,一个在外面。
闭包的类型为function<void, void>
,我还将其包装在光纤中并将其放入线程本地队列中。
现在在任务系统之外我可以检查该单元格,如果计数器已减少到0.如果我知道task
必须已经完成,否则我必须等待。我只在任务系统外的主线程中等待。在任务系统内部,我可以重新安排。
之前我没有做过任何多线程编程,这是我能想象实现&#34;消息传递的唯一方式&#34;。
我很确定我的Cell
之类的东西已经被发明了,但我不确定它的总称是什么。
这是实现消息传递的常用方法吗?我的意思是&#34;在封闭内包裹cell
并等待完成&#34;。
我Cell
的正确名称是什么?是否有在线提供的任何实施?
答案 0 :(得分:1)
有一种传递一条消息的方法,它被称为“未来”。 “未来”是一个将在(接近)未来(即名称)中保存值的对象,您可以轮询它(或等待)以获取该值。在C ++ 11中,它以std::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;
对于返回的未来,您可以等待一个值(阻止调用)或轮询它以了解该值何时完成。
加分:您还可以创建std::future<void>
,在这种情况下,您仍然可以拨打get()
或仍然进行投票;它将成为完成功能的信号。