c++11

c++线程池实现

咳咳。c++11 加入了线程库,从此告别了标准库不支持并发的历史。然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池、信号量等。线程池(thread pool)这个东西,在面试上多次被问到,一般的回答都是:“管理一个任务队列,一个线程队列,然后每次取一个任务分配给一个线程去做,循环往复。” 貌似没有问题吧。但是写起程序来的时候就出问题了。

废话不多说,先上实现,然后再啰嗦。(dont talk, show me ur code !)

centos下安装llvm+clang

不知道从神马时候开始,llvm+clang 就进入了 me 的眼球,以前只知道有 gcc,有 vc++。llvm 是个编译器的 back-end,像 JVM 或是 .NET 的 CLR (公共语言运行时), clang 是编译器的 front-end,负责将 c、c++、objective-c、objective-c++ (objective-c 和 c++的混合) 编译成中间语言。 c++11/14 支持最好的两个编译器 gcc 和 clang,前者版本到了 4.8.2 (GCC),后者 3.4 (Clang)。gcc 是前辈,而 clang 是后起之秀,对于学习 c++14 来说更好的选择是 clang (完全支持 c++11 语言、库和 c++14 的所有草案)。

me 使用的是 centos 系统,使用赶脚很不爽,上面很多包没有安装是一方面,另一方面有些包的版本过低,如果自己安装的话,使用命令 $rpm -ql package 完全搜不到(安装信息),O__O"…。前面安装 GCC 4.8.1 如此,这次安装 llvm+clang 亦如此。

c++11介绍

废话少说

Tags: 

c++11中信号量(semaphore)的实现

c++11中有 mutex (互斥量),有 condition_variable (条件变量),并没有 semaphore (信号量)。信号量,操作系统中一般都有提,后来 google 说可以使用 mutex+condition_variable 实现一个,后来写来写去,都死锁 (deadlock) ——,O__O"…,后来 google 了一个,整理了一下思路。

信号量

神马是信号量?信号量是一个整数 count,提供两个原子(atom,不可分割)操作:P 操作和 V 操作,或是说 wait 和 signal 操作。

c++11中的同步方法

多线程编程中如果不出现数据共享的话,是最好不过的,“你走你的阳关道,我走我的独木桥” —— “大家井水不犯河水”;然而几乎不可能,因为很多时候只有共享数据才有意义。对于共享的数据,如果大家都是读(read)的话,也没有太大问题,麻烦就麻烦在有读(read)有写(write),可能是很多个读和很多个写,这个时候如果不做点什么的,结果就难以预料了,或是看到非预期的结果;这类问题叫数据竞争(data race)。下面是 c++ 的一个多线程程序,创建三个线程 th1、th2、th3,大家把共享的数据 sum (初始值为 0)各加 100000,预期的结果是 300000。

Tags: 

c++11并发多线程编程

c++11 出来快有两年了,其在 98/03 年的基础上增添了不少东西,右值引用、移动语义、类型推断、lambda 表达式、统一初始化等等等等,标准库中也增加了并发/多线程、正则表达式支持。vs 2012 对 c++11 有部分支持;gcc 4.7.x 有大部分支持,但是不支持多线程,而 4.8.0 对 c++11 几乎全部支持(官网上说 *this 的右值引用、小型垃圾回收器和内存泄露检测不支持),目前最新的版本已到 4.8.1。llvm+clang 3.2 对 c++11 也接近全部支持。所以学习 c++11 可以考虑使用前面的三个编译器。

Tags: