没有合适的资源?快使用搜索试试~ 我知道了~
首页c++11封装thread库的方法示例
c++11封装thread库的方法示例
16 下载量 108 浏览量
更新于2023-03-16
评论
收藏 64KB PDF 举报
C++11 ,封装了thread的多线程的类,这样对多线程的使用更加方便。下面这篇文章主要给大家介绍了关于c++11封装thread库的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
资源详情
资源评论
资源推荐
c++11封装封装thread库的方法示例库的方法示例
C++11 ,封装了thread的多线程的类,这样对多线程的使用更加方便。下面这篇文章主要给大家介绍了关于
c++11封装thread库的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
前言前言
c++11在语言层面上提供了对thread的支持,由于不同的平台提供了不同线程API,在语言层面提供了对thread的支持可以大大
的减小代码移植的工作量。
本文将给大家详细介绍关于c++11封装thread库的相关内容,下面话不多说了,来一起看看详细的介绍吧
基本接口要求基本接口要求
要求std::thread的构造函数
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
但是OS的库函数定义为:
error_code create_thread((void_or_error_code(*entry)(void *), void *data);
主要是接口中的entry,本身使用void*根本没带类型信息,难点在于要做到模板暴露出类型从而可以通用化
void_or_error_code entry_point(void *arbitrary_data);
第一个问题:把第一个问题:把f和和args统统打包在一起做成一个统统打包在一起做成一个void *结构结构
我们得从void* 中获取函数指针和参数指针,首先来个结构体定义真实指针类型
struct thread_data_base
{
virtual ~thread_data_base(){}
virtual void run()=0;
};
需要一个tuple,用于保存f和args,这样我们就可以通过将void *data cast成thread_data_base *,然后调用其中的虚函数run
来实际调用f(args…)
std::tuple<typename std::decay<F>::type, typename std::decay<ArgTypes>::type...> fp;
而entry函数实现效果大致如下,将结构体包装在该函数里面
void_or_error_code thread_entry(void *data) {
std::unique_ptr<thread_data_base> p((thread_data_base *)data);
p->run();
// return result of p->run() if error code is required
}
第二个问题:定义一个第二个问题:定义一个template,以适配不同类型的,以适配不同类型的f和和args
template<typename F, class... ArgTypes>
class thread_data : public thread_data_base
{
public:
thread_data(F&& f_, ArgTypes&&... args_): fp(std::forward<F>(f_), std::forward<ArgTypes>(args_)...) {}
private:
std::tuple<typename std::decay<F>::type, typename std::decay<ArgTypes>::type...> fp;
}
在这个template里有一个data member正是那个关键的tuple,其类型需要使用traits进行类型推理出来
第三个问题:把任意的第三个问题:把任意的f和和args包装成一个包装成一个thread_data_base *
定义创建函数可以将任意f和arg来创建一个void*结构体,用来被entry函数调用
template<typename F, class... ArgTypes>
inline thread_data_base *make_thread_data(F&& f, ArgTypes&&... args)
{
return new thread_data<typename std::remove_reference<F>::type, ArgTypes...>(std::forward<F>(f),
std::forward<ArgTypes>(args)...); // 啥时候释放?
}
第四个问题:如何处理第四个问题:如何处理Args…
weixin_38705014
- 粉丝: 4
- 资源: 935
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0