如何为单个邮件实现邮件传递?

时间:2016-06-11 10:42:40

标签: c++ multithreading

我已经实施了一个工作/任务系统。您可以创建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的正确名称是什么?是否有在线提供的任何实施?

1 个答案:

答案 0 :(得分:1)

有一种传递一条消息的方法,它被称为“未来”。 “未来”是一个将在(接近)未来(即名称)中保存值的对象,您可以轮询它(或等待)以获取该值。在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. 对于返回的未来,您可以等待一个值(阻止调用)或轮询它以了解该值何时完成。

  4. 加分:您还可以创建std::future<void>,在这种情况下,您仍然可以拨打get()或仍然进行投票;它将成为完成功能的信号。