作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以 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
需要做的事情。我稍微简化了一些东西,因为它是噪音(没有标准引用支持,没有衰减等)。
第一步,获取F
和Args...
并将它们绑定(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/
我是一名优秀的程序员,十分优秀!