gpt4 book ai didi

c++ - C++11 线程如何包裹 pthreads

转载 作者:行者123 更新时间:2023-11-30 02:34:59 26 4
gpt4 key购买 nike

所以 C++11 线程是大多数系统上 pthreads 的包装器,我很困惑从可变参数函数到具有指定返回类型的更严格函数的语法如何工作(即带有 pthreads 的回调函数)可以有人能举个例子来说明吗?

最佳答案

假设您有一个 C 风格的界面,如下所示:

Foo run( Foo(*)(void*), void* );

你想写:

template<class F, class...Args>
std::result_of<F(Args...)>
smart_run( F&& f, Args&&... args );

这类似于在 pthreads 之上实现 std::thread 需要做的事情。我稍微简化了一些东西,因为它是噪音(没有标准引用支持,没有衰减等)。

第一步,获取FArgs... 并将它们绑定(bind)起来。类似 std::bind(f, args...) 的东西返回一个返回结果的零参数函数。

有了这个,我们只需要解决:

template<class F>
std::result_of<F()>
smart_run( F&& f );

它接受一个任意的可调用对象,然后使用上面的run 来运行它。

诀窍是在免费商店上创建一个 f 的拷贝和一个调用它的函数,如下所示:

template<class F>
std::result_of<F()>
smart_run( F&& f ){
struct data{
F f;
std::result_of_t<F()> r;
};
data*p = new data{std::forward<F>(f)};
Foo ignored=run(
[](void* p){
data* self=static_cast<data*>(p);
auto& f=self->f;
self->r = f();
return Foo{}; // whatever
},
p
);
auto r=data->r;
delete data;
return r;
}

现在,r 是赋值的而不是构造的。但这个想法的核心 -- 您在 void* 中传递了奇特的可调用函数,然后函数解包它并与之交互,就完成了。

在 pthread 上的真实线程中,您会将指向 std::thread-state 的指针传递给 pthread 调用程序。它会设置任何东西,调用存储过程,完成后会获取返回值并将其存储在内部 std::thread 状态(如果需要)。然后您可以通过与内部 std::thread 状态交互来获取该数据。

或其他大致相同的内容。

关于c++ - C++11 线程如何包裹 pthreads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34114001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com