C++线程与原生线程
Intro:写本文时,笔者正被C++线程与Linux原生线程所困扰,本文通过简单比较其原理和基本概念,可以帮助读者梳理二者区别。
1. posix thread介绍
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准意在期望获得源代码级别的软件可移植性。
换句话说,为一个POSIX兼容的操作系统编写的程序,应该可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。
那么什么是posix thread呢?posix thread是 操作系统级(OS level)的API规范,主要用来定义线程及线程间同步的相关操作,采用C语言定义。posix规范主要在unix like类系统上实现;Windows类系统采用了自己的线程API。
Linux下的原生线程库pthread使用底层的C来编写,没有什么抽象封装,仅仅是一种简单、暴力美。
2. C++ 11线程库
目前很多语言都在其标准库中提供了 语言级的线程支持:如Java中的Thread,concurrenty包;python中的threading model;C++11标准中的thread库等。
还有很多以第三方库方式提供的各种语言的线程实现,就不一一列举了。但是要注意:C++11从语言层面支持多线程操作,本质上是对系统调用的封装,极大的方便了开发人员。
虽然大家说性能不咋样,但是十分方便:支持lambda、支持任意多个参数、设计良好…
3. linux下<pthread.h>和C++的std::thread的区别:
- pthread是UNIX-Like下的线程库,是操作系统层面的调用;thread是C++11从语言层面开发的一套线程库,底层调用的还是系统API。
- pthread是系统原生线程库,效率功能上好像更好;
- std::thread使用更加方便。
4. Linux下,多线程编程是使用原生线程库还是std::thread?
总的来说,要考虑两个方面:
-
取决于现有项目采用的方案和GCC版本
如果现有项目有了某个足够好的线程库,那就没必要使用C++11线程库,否则,优先考虑C++11线程库。
-
取决于有没有跨平台需求
如果需要跨平台,那就选择平台抽象层次更高的方案来节省劳动。而各个操作系统都对C++11有着良好的实现,从代码的可维护性、开发简易度上来说,C++11是一个比较好的选择。
5. summary
Go and Learn C++!!!