小编Rom*_*lak的帖子

实现future :: then()等效于c ++ 11中的异步执行

then()Herb Sutter的演讲中有一些关于函数实现的问题.此函数用于链接异步操作,参数f是一个操作的未来,参数w是此操作的"工作"(lambda).

template <typename Fut, typename Work>
auto then(Fut f, Work w) -> future<decltype(w(f.get()))>
{
    return async([=]{ w(f.get()); });
}
Run Code Online (Sandbox Code Playgroud)

申请的一个例子是:

    std::future<int> f = std::async([]{
        std::this_thread::sleep_for(std::chrono::microseconds(200));
        return 10;
    });

    auto f2 = then(std::move(f), [](int i){
        return 2 * i;
    });
Run Code Online (Sandbox Code Playgroud)

主线程产生任务但不等待它们中的任何一个完成.

首先,future<T>没有复制构造函数.这意味着,shared_future<T>除非我们将调用更改async()为将未来移动到lambda ,否则建议的实现只能用于.这个问题提出了一种方法,但似乎太复杂了.我重新实现了这个功能,我想知道我的代码是否正确或是否遗漏了一些东西......

其次,传递给then()函数的未来可能是void这样,我们实际上需要2个实现then(),对吧?一个用于期货回归T,一个用于期货回归void.

最后,如果body内的lambda then()没有return语句,那么我们实际上可以返回值吗?如果没有return语句,那么返回future<void>吧?

我试图解决上述问题,这就是我想出的.这是对的吗?

template <typename T, typename …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency asynchronous c++11

29
推荐指数
2
解决办法
1万
查看次数

编译使用套接字函数bind()和libcxx的代码失败

我正在使用新的libcxx库,我有一个调用套接字函数的代码bind().问题是,当我键入using namespace std;编译器时,给出了以下代码的错误:

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));
Run Code Online (Sandbox Code Playgroud)

使用clang(svn build)的错误:

error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int'
 int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));
Run Code Online (Sandbox Code Playgroud)

我认为问题是using namespace std;将函数std::bind()从标题<functional>带到范围(尽管标题不包括在内).由于我使用的是使用整个命名空间std的第三方库,因此我无法轻易将类名更改为完全限定名.

我想知道这是否是库的实现中的问题,或者C++ 11中是否存在可能会破坏使用的旧代码的新规则bind().对此的任何想法将不胜感激.

谢谢

罗马

c++ bind c++11

12
推荐指数
1
解决办法
3727
查看次数

标签 统计

c++ ×2

c++11 ×2

asynchronous ×1

bind ×1

concurrency ×1