判断一个类型是否为某个模版类的实例

比如我们可以用它来判断某个类型是否为tuple

test code

 

thinking in object pool

1.背景

对象池为了避免频繁创建耗时或耗资源的大对象,事先在对象池中创建好一定数量的大对象,然后尽量复用对象池中的对象,用户用完大对象之后放回对象池。

2.问题

目前纵观主流语言的实现方式无外乎3个步骤:

  1. 初始创建一定数量的对象池(也允许从外面添加对象)。
  2. 从对象池中取对象来使用。
  3. 用完之后返回对象池。

一般情况下这样是OK的,可能存在的问题是在第三步,有两个问题:

  1. 不方便,每次都需要显式回收对象。
  2. 忘记将对象放回对象池,造成资源浪费。

3.改进动机

解决显式回收的问题,实现自动回收,省心省力。

4.技术内幕

借助c++智能指针,因为智能指针可以自定义删除器,在智能指针释放的时候会调用删除器,在删除器中我们将用完的对象重新放回对象池。思路比较简单,但实现的时候需要考虑两个问题:

  1. 什么时候定义删除器?
  2. 用shared_ptr还是unique_ptr?

4.1什么时候定义删除器

自定义删除器只做一件事,就是将对象重新放入对象池。如果对象池初始化的时候就自定义删除器的话,删除器中的逻辑是将对象放回对象池,放回的时候无法再定义一个这样的删除器,所以这种做法行不通。
需要注意,回收的对象只能是默认删除器的。除了前述原因之外,另外一个原因是对象池释放的时候需要释放所有的智能指针,释放的时候如果存在自定义删除器将会导致对象无法删除。
只有在get的时候定义删除器才行,但是初始创建或加入的智能指针是默认删除器,所以我们需要把智能指针的默认删除器改为自定义删除器。

4.2用shared_ptr还是unique_ptr

因为我们需要把智能指针的默认删除器改为自定义删除器,用shared_ptr会很不方便,因为你无法直接将shared_ptr的删除器修改为自定义删除器,虽然你可以通过重新创建一个新对象,把原对象拷贝过来的做法来实现,
但是这样做效率比较低。而unique_ptr由于是独占语义,提供了一种简便的方法方法可以实现修改删除器,所以用unique_ptr是最适合的。

4.3实现源码

如果你坚持用shared_ptr,那么回收的时候你需要这样写:

这种方式需要每次都创建一个新对象,并且拷贝原来的对象,是一种比较低效的做法。

5.总结

凡是需要自动回收的场景下都可以使用这种方式:在获取对象的时候将默认删除器改为自定义删除器,确保它可以回收。注意,回收的智能指针使用的是默认删除器,可以确保对象池释放时能正常释放对象。同时也将获取对象和释放对象时,对象的控制权完全分离。
其他的一些应用场景:多例模式,无需手动释放,自动回收。

worksteal thread pool

worksteal的场景

对于一个线程池,每个线程有一个队列,想象这种场景,有的线程队列中有大量的比较耗时的任务堆积,而有的线程队列却是空的,现象就是有的线程处于饥饿状态,而有的线程处于消化不良的状态,这时就需要一种方法来解决这个问题。
需要worksteal,顾名思义就是任务窃取,当一个线程处于饥饿状态时,它就会去其它的线程队列中窃取任务,解决线程饥饿导致的效率底的问题。

worksteal要点

  • 每个工作线程将任务放到它内部的队列中;
  • 队列是一个双端队列,支持LIFO的push_front和pop_front操作和FIFO的take操作。
  • 工作线程处理任务通过LIFO来处理最新的任务。
  • 当一个线程处理完了队列中的任务之后,它会试图窃取其他线程队列的任务,根据FIFO从队列的尾部取任务。
  • 如果窃取任务失败则继续尝试,直到所有的线程队列都没有任务了。

QQ图片20151118180330

 

worksteal值得探讨的问题

worksteal的适用场景

worksteal适用场景是任务之间的耗时相差比较大,即有的任务很耗时,有的任务很快完成,这种用worksteal很合适;如果任务的耗时很平均则不适合,因为窃取任务也是需要抢占锁的,会造成额外的消耗。

窃取任务的策略

有很多种任务窃取策略,比如从任务最多的线程中窃取或随机窃取,需要根据实际情况来选择。

窃取任务的粒度

是每次窃取一个任务还是窃取一批任务也是需要考量的,如果窃取的一批任务比较耗时,又会导致其它线程来窃取,这样造成了无谓的消耗;如果一次窃取一个任务,而任务很快完成,这又导致重新窃取,降低了效率。这个粒度也是需要根据实际情况调整的。

worksteal thread pool源码

参考资料

A Java Fork/Join Framework

Scheduling Multithreaded Computations by Work Stealing

C++技术沙龙报名啦!

唯有技术干货才适合这样装B的场合,不止于走码观花,我们力求在每一个脑洞大开的背后,寻找被忽略的蛛丝码迹,继续我们的脑洞大开运动会,在C/C++的世界里做一个 英姿飒爽的骑士 — 致颜值高得不像实力派的攻城狮们。

主题:技术沙龙 — 牛人码面

时间:2015年12月5日,14:00 — 18:00

地点:金山软件大厦1楼VIP室(广东省珠海市吉大莲山巷8号金山软件大厦(519015) )

沙龙课题

  • 《C++17新特性带来的改善与影响》C++编译器开发工程师,<<深入理解C++11>>(第二版)作者   IBM 吴钊
  • 《Nginx 在windows系统下优化》开源项目 Nginx Openresty For Windows 的发起者,360互联网安全中心 张家柱
  • 《C++中使用golang的协程》实战派C++er大型分布式系统架构设计者 魅族科技 于洋子

内容&讲师介绍:

一、吴钊:IBM XL C++编译器开发工程师,目前主要从事Clang与IBM编译器的融合。对C++语言具有浓烈的兴趣,参与《深入理解C++11》(第二版)的编写,长期活跃于知乎社区C++与编译器板块,ID为蓝色。

内容简介:C++17将会是下一个C++标准,不同于C++14对C++11的小改进,这将会是一个大的标准发布。在该标准中,也将计划引入很多让人兴奋的特性,如有利于改善编译时间的Module System,有利于改善编译器模板错误信息诊断的Concept,文件系统、网络库(基于Boost ASIO)、协程、SIMD等,而我将在此次分享中将着重分享Module System和Concept这两个影响很深远的C++17新特性。

二、于洋子:魅族科技,Linux-C++工程师  在大型分布式系统的设计与开发方面有丰富的经验 魅族用户量百万级走向千万级的见证者。

内容简介:作为C++er的你, 是否曾羡慕golang协程极佳的开发效率,而面对自己异步回调满天飞的代码黯然神伤?是否曾羡慕golang\erlang这种并发语言可以很简单地利用多核CPU,

而对C++多线程编程的复杂性望而却步? 在沙龙分享开源项目cpp_features,帮助你利用C++的高性能的同时获得golang一般的开发效率.

KeyNote:

  1. 同步、异步、协程Demo
  2. C++协程
  3. 协程调度
  4. 阻塞网络IO
  5. 三方库
  6. 语法
  7. 其他特性
  8. 上层封装

三、张家柱:360互联网安全中心,开源项目 Nginx Openresty For Windows 的发起者。

内容简介:

1、概述:
与官网 windows 版本对比
子进程启动方式(主要的差异)
代码差异
2、共享内存
共享内存坑一(无法使用共享内存)&解决方案
共享内存坑二&解决方案
3、性能改进
单进程限制
1024 连接数限制
新的网络模型
大名鼎鼎的 IOCP模型
使用 WSAPoll 模型
4、其他
多实例的支持

报名邮箱:lvxuee@kingsoft.com(来信注明姓名+联系方式+擅长技术或领域)免费报名。

互动奖品:小米自拍杆、运动手环、小米充电宝、wifi放大器、小米音响。

活动流程:

项  目 人 员 时 间 备 注
《C++17新特性带来的改善与影响》 吴钊 14:00-14:50 IBM
下午茶 漂亮MM 14:50-15:00 糕点、水果、咖啡
《Nginx 在windows系统下优化》 张家柱 15:00-15:50 360互联网安全中心
抽奖 漂亮MM 15:50-16:00 试手气
《C++中使用golang的协程》 于洋子 16:00-16:50 魅族科技
圆桌交流 ALL 17:00-17:30 自由交流

填写报名信息:

 

非UI线程post到UI线程的一种简单办法–基于Qt

直接上代码,2.如果担心单例的多线程问题,可以在主线程里面初始化一下,或者自己改成线程安全的,如果编译器不支持c++11的bind+function,可以使用boost替代,如果支持,可以直接用c++11的bind+function替换

接下来是实现文件:

ps:1.qt_c_post_fun针对函数里有__cdecl的,这个用boost的时候,要定义一个宏,才能用
2.外部使用这四个函数:
void post_ui(qt_post_fun);
void post_c_ui(qt_c_post_fun);
void post_ui_block(qt_post_fun);
void post_c_ui_block(qt_c_post_fun);
带block的是阻塞的,比如弹消息框的时候,可以用到
post_ui(bind(widget::show,w));
post_ui_block(bind(showMsgBox,”Warngin”));

check member function

 

check member type

检查类里是否存在某种类型的几种方法,以检查xxx类型为例:
方法1:

方法2:

方法3:

测试代码:

Copy Protected by Chetan's WP-Copyprotect.