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

标签 c++ multithreading

我实现了一个工作/任务系统。您可以创建一个 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 .

针对您的情况:

  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()或仍然投票;它将作为功能完成的信号。

关于c++ - 如何实现单个消息的消息传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37762771/

相关文章:

c# - 为什么这个 ThreadPool.QueueUserWorkItem 代码没有让我的测试失败?

c++ - 如何找出对 C++ 符号的引用

multithreading - 'The thread that releases a semaphore need not be the same thread that acquired it'是什么意思?

c++ - 将函数作为参数传递以简化线程创建

带有 Swing UI 的 Java 线程

linux-kernel - 如何进行内核线程通信?

C++ 单例类 getInstance(作为 java)

c++ - 在内联汇编中访问 C++ 类成员

c++ - 从文件中的特定位置查找文件中最后一次出现的字符串

c++ - soapcpp2 版本 2.8.1 丢失的文件