【发布时间】:2020-11-22 04:42:49
【问题描述】:
我有一些课程,有queue 的std::function<void()> 成员和方法Push 和Pop。
我想实现加法PushAndWaitUntilExecuted。当你有一个consumer-thread(打电话给Pop)和一个producer-thread(打电话给Push)时,这很容易——只需简单的std::condition_variable就足够了。
但是我的应用程序有动态数量的线程,它们可以通过并行调用 PushAndWaitUntilExecuted 函数来执行相同的代码行,并等到 consumer-thread 执行推送 std::function 对象。
一个想法是将std::pair<uint64_t, std::function<void()>> 传递给queue 而不仅仅是std::function<void()>,其中uint64_t - producer-thread ID(boost::this_thread::get_id())。然后consumer-thread调用std::condition_variable::notify_all(),所有线程将检查执行std::function是否与线程有相同的ID。
是好的解决方案还是可以实施更好的解决方案?
【问题讨论】:
-
使用多个条件变量并将它们与函数对象一起存储不是更好吗?然后,任何线程都可以只等待一个特定的函数(并且在执行其他函数时不会被唤醒)。
标签: c++ multithreading boost std