阻止许多锁/期货/等.直到任何准备好

Ziz*_*Tai 12 c++ multithreading c++11

是否有可能阻止一组锁/期货/任何可阻止的实体,直到其中任何一个准备就绪?我们的想法是:

std::vector<std::future<T>> futures = ...;
auto ready_future = wait_until_an_element_is_ready(futures);
process(ready_future.get());
Run Code Online (Sandbox Code Playgroud)

我记得像libevent,libev和libuv这样的库具有IO任务的这种能力.但我不知道这些是否可以用于锁/期货.

我想到的一种方法就是让期货在完成后调用一个处理程序,但同时将处理程序比较并交换为null,这样其他期货就不能调用它.然而,这需要协调期货,因此无法对锁进行.

更新:似乎有一个针对C++ 2x 的提议.

Ric*_*ges 6

如果您有可用的增强功能,其线程功能远远超过标准库.

这将是在c ++ 17之后的情况,以及事物的外观,即使在c ++ 20之后.

#include <future>
#include <vector>

#define BOOST_THREAD_VERSION 4
#include <boost/thread.hpp>


void wait_for_any(std::vector<boost::future<void>> & v)
{
    boost::wait_for_any(std::begin(v), std::end(v));
}
Run Code Online (Sandbox Code Playgroud)