我需要这样的东西:
void launch_task()
{
std::thread([](){ run_async_task(); });
}
Run Code Online (Sandbox Code Playgroud)
除了线程的析构函数将终止我的任务.我不需要对任务进行任何控制,也不需要返回值.它必须运行它,然后线程应该终止并且应该处理C++线程对象.我需要什么C++ 11工具?
我看过了std::async
,但找不到我案例的用法示例.它似乎是一个非常复杂的系统,我需要以某种方式存储和操作std::future
它或它变得同步(如果我的理解是正确的;我没有找到一篇好的明确文章std::async
).
我有一些需要异步执行的任务,并且仍然有正在运行的任务无法关闭服务器。因此,我试图将返回的期货存储std::async
在一个列表中,但我也不想获得一个无限增长的列表。因此,我想在期货完成后将其删除。
这大致就是我要做的事情:
// this is a member of the server class
std::list<std::future<void>> pending;
std::list<std::future<void>>::iterator iter = ???;
pending.push_back( std::async( std::launch::async, [iter]()
{
doSomething();
pending.remove( iter );
} );
Run Code Online (Sandbox Code Playgroud)
在这里,iter
需要指向新插入的元素,但是在插入元素之前(没有迭代器)或之后(因为它是按值传递给lambda的),我都无法获得它。我可以创建一个shared_ptr
存储迭代器的方法,但这似乎太过分了。
有更好的模式吗?
更新:似乎还有另一个问题。当将来尝试将自己从列表中删除时,它实际上是在等待自己完成,从而锁定了所有内容。糟糕!
最重要的是,列表析构函数在调用元素析构函数之前清空列表。
我要调用的方法foo()
超时(例如1分钟)。如果执行时间少于1分钟,则返回结果。否则将引发异常。这是代码:
//PRINT "START" IN THE LOG
auto m = std::make_shared<std::mutex>();
auto cv = std::make_shared<std::condition_variable>();
auto ready = std::make_shared<bool>(false);
auto response = std::make_shared<TResponse>();
auto exception = std::make_shared<FooException>();
exception->Code = ErrorCode::None;
std::thread([=]
{
std::unique_lock<std::mutex> lk(*m);
cv->wait(lk, [=]{ return *ready; });
try
{
//PRINT "PROCESS" IN THE LOG
auto r = foo();
*response = std::move(r);
}
catch(const FooException& e)
{
*exception = std::move(e);
}
lk.unlock();
cv->notify_one();
}).detach();
std::unique_lock<std::mutex> lk(*m);
*ready = true;
cv->notify_one();
auto status = cv->wait_for(lk, std::chrono::seconds(60));
if (status == …
Run Code Online (Sandbox Code Playgroud) 我正在构建一组在事件调度期间在 GUI 线程中工作的期货,并希望采用 std::future 的 API,但遇到了链接期货(非阻塞异步执行)的问题。
假设我们有一个返回未来的函数,我们想在未来准备好后执行一些事情
disconnect().then([](std::future<State> &&f) {
...
});
Run Code Online (Sandbox Code Playgroud)
我的理解是,当从“then”返回的未来不做任何事情时,它将被销毁,未来将被中止,函数将不再被执行。因此,为了确保链仍然存在并正确执行,我们必须将未来保存在某处(可能作为数据成员)。
如果我们对返回的未来不感兴趣,而只对操作链和函数正确执行感兴趣,我们该怎么办?我们是否应该将返回的 future 移入 anew std::future<R>(...)
并在完成后在 lambda 中将其删除,例如“删除 &f;” ? 不过,这看起来不对。
我有这样的代码:
int function()
{
std::vector<std::future<int>> futures;
for (const auto& elem : elements)
{
futures.push_back(std::async(&MyClass::foo, myClass, elem);
}
for (auto& f : futures)
{
const int x = f.get();
if (x != 0)
return x;
}
}
Run Code Online (Sandbox Code Playgroud)
当有未完成的异步调用时,我可以从函数返回吗?我只对一个非零值感兴趣.我应该等到所有异步调用完成吗?这段代码安全吗?
所以我遇到了一些似乎违背了目的std::thread
或至少使它不那么方便的东西。
假设我想生成一个std::thread
来执行一项任务一次,并且不想在那之后再次担心它。我thread
在函数末尾附近创建了这个函数,因此std::thread
在我的例子中,它很快就会超出范围,很可能在它thread
仍在运行时。这会产生一些解决方案(或者至少我知道的)的问题。
我可以:
A)将其设置为std::thread
全局变量,这样它就不会超出范围。
B) 调用join()
它std::thread
违背了生成线程的目的。
还有其他更好的方法来处理这种情况吗?