相关疑难解决方法(0)

什么是C++ 11启动异步任务并忘掉它的方法?

我需要这样的东西:

void launch_task()
{
    std::thread([](){ run_async_task(); });
}
Run Code Online (Sandbox Code Playgroud)

除了线程的析构函数将终止我的任务.我不需要对任务进行任何控制,也不需要返回值.它必须运行它,然后线程应该终止并且应该处理C++线程对象.我需要什么C++ 11工具?

我看过了std::async,但找不到我案例的用法示例.它似乎是一个非常复杂的系统,我需要以某种方式存储和操作std::future它或它变得同步(如果我的理解是正确的;我没有找到一篇好的明确文章std::async).

c++ multithreading c++11

28
推荐指数
2
解决办法
6277
查看次数

如何在列表中存储自动删除的期货

我有一些需要异步执行的任务,并且仍然有正在运行的任务无法关闭服务器。因此,我试图将返回的期货存储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存储迭代器的方法,但这似乎太过分了。

有更好的模式吗?

更新:似乎还有另一个问题。当将来尝试将自己从列表中删除时,它实际上是在等待自己完成,从而锁定了所有内容。糟糕!

最重要的是,列表析构函数调用元素析构函数之前清空列表。

c++ future c++17

8
推荐指数
1
解决办法
277
查看次数

调用超时方法

我要调用的方法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)

c++ c++14 c++17

6
推荐指数
1
解决办法
361
查看次数

并发 TS:std::future&lt;...&gt;::then,如何在不存储返回的未来的情况下保持链活着?

我正在构建一组在事件调度期间在 GUI 线程中工作的期货,并希望采用 std::future 的 API,但遇到了链接期货(非阻塞异步执行)的问题。

假设我们有一个返回未来的函数,我们想在未来准备好后执行一些事情

disconnect().then([](std::future<State> &&f) {
   ...
});
Run Code Online (Sandbox Code Playgroud)

我的理解是,当从“then”返回的未来不做任何事情时,它将被销毁,未来将被中止,函数将不再被执行。因此,为了确保链仍然存在并正确执行,我们必须将未来保存在某处(可能作为数据成员)。

如果我们对返回的未来不感兴趣,而只对操作链和函数正确执行感兴趣,我们该怎么办?我们是否应该将返回的 future 移入 anew std::future<R>(...)并在完成后在 lambda 中将其删除,例如“删除 &f;” ? 不过,这看起来不对。

c++ future c++17

5
推荐指数
1
解决办法
1213
查看次数

在所有std ::期货结束之前从函数返回是否安全?

我有这样的代码:

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)

当有未完成的异步调用时,我可以从函数返回吗?我只对一个非零值感兴趣.我应该等到所有异步调用完成吗?这段代码安全吗?

c++ asynchronous future c++11

5
推荐指数
1
解决办法
553
查看次数

std::thread 不是全局变量,但在到达创建它的函数末尾时不会超出范围?

所以我遇到了一些似乎违背了目的std::thread或至少使它不那么方便的东西。

假设我想生成一个std::thread来执行一项任务一次,并且不想在那之后再次担心它。我thread在函数末尾附近创建了这个函数,因此std::thread在我的例子中,它很快就会超出范围,很可能在它thread仍在运行时。这会产生一些解决方案(或者至少我知道的)的问题。

我可以:

A)将其设置为std::thread全局变量,这样它就不会超出范围。

B) 调用join()std::thread违背了生成线程的目的。

还有其他更好的方法来处理这种情况吗?

c++ multithreading c++11 stdthread

3
推荐指数
1
解决办法
1118
查看次数

标签 统计

c++ ×6

c++11 ×3

c++17 ×3

future ×3

multithreading ×2

asynchronous ×1

c++14 ×1

stdthread ×1