2016-06-11 49 views
0

我已经实施了一个工作/任务系统。您可以创建function<void, void>并将其放置在线程本地队列中,然后将函数包装到光纤中。如何实现单个消息的消息传递?

现在,这件作品现在完全正常,但如果我不能返回值,它将是无用的。 function<T, void>

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

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

关闭是function<void, void>类型,我也把它包装在一个光纤中,并把它放在一个线程本地队列中。

现在在任务系统之外,我可以检查该单元是否计数器已递减为0.如果已知,task必须已完成,否则我必须等待。我只等待任务系统之外的主线程。在任务系统内部,我可以重新安排时间。

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

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

这是实现消息传递的常用方法吗?我的意思是“封闭一个cell并等待完成”。

我的Cell的正确名称是什么?有没有可用的在线实现?

回答

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. 随着未来返回你可以等待一个值(阻塞调用)或查询时,它的价值是为了知道。

奖励:你也可以创建一个std::future<void>,在这种情况下,你仍然可以调用get()或静止轮询它;它将作为完成该功能的信号。