POSIX线程-为什么要用线程
2015-07-04 16:47
274 查看
最简单的回答是:线程比进程更快,开销更小。考虑一下下面的场景:
1. 当需要在在进程间共享数据时,我们必须使用IPC来进行通信,因为两个进程间没有“天生”的共享内存区(进程要求虚拟空间独立,如果想共享数据,必须把这几个进程的某个地址映射到相同的物理内存上)。IPC的使用将会导致开销上升。
2. 需要创建新进程时,我们使用fork()函数。虽然该函数不会拷贝所有的数据,但是最基本的数据,比如页表,文件描述符表等还是需要创建的。这也会导致开销上升。
而线程完全不会有上面的问题。两个线程之间的数据共享是很自然的事,因为同一进程的线程都在一个虚拟地址空间,数据的共享就像变量赋值一样(但要注意同步问题)。线程的创建也比进程的创建快,因为它不需要复制和创建很多数据。
当然,线程并不是用来替代进程的,它自身也有缺点,它的出现只是给了程序员另一种选择。比如我们在线程中使用的函数必须是thread-safe的(即多个线程访问同一函数不会影响输出的结果);一个线程的bug很可能会引起该进程的崩溃(所有的线程都在同一个虚拟地址空间内,一个线程能很容易的访问到另一个线程的空间),线程间可能会有同步问题。所以使用线程的程序必须很小心的设计和实现。
1. 当需要在在进程间共享数据时,我们必须使用IPC来进行通信,因为两个进程间没有“天生”的共享内存区(进程要求虚拟空间独立,如果想共享数据,必须把这几个进程的某个地址映射到相同的物理内存上)。IPC的使用将会导致开销上升。
2. 需要创建新进程时,我们使用fork()函数。虽然该函数不会拷贝所有的数据,但是最基本的数据,比如页表,文件描述符表等还是需要创建的。这也会导致开销上升。
而线程完全不会有上面的问题。两个线程之间的数据共享是很自然的事,因为同一进程的线程都在一个虚拟地址空间,数据的共享就像变量赋值一样(但要注意同步问题)。线程的创建也比进程的创建快,因为它不需要复制和创建很多数据。
当然,线程并不是用来替代进程的,它自身也有缺点,它的出现只是给了程序员另一种选择。比如我们在线程中使用的函数必须是thread-safe的(即多个线程访问同一函数不会影响输出的结果);一个线程的bug很可能会引起该进程的崩溃(所有的线程都在同一个虚拟地址空间内,一个线程能很容易的访问到另一个线程的空间),线程间可能会有同步问题。所以使用线程的程序必须很小心的设计和实现。
相关文章推荐
- POSIX线程-什么是线程
- 【足迹C++primer】52、,转换和继承虚函数
- 树 树的概念 树的存储结构
- 社会主义市场经济的实践依据
- C++中的namespace
- XML解析
- POSIX线程-条件变量(二)
- Sqoop工具
- Servlet的一些知识
- 编码方式
- Redis Mac 安装及简单命令使用
- 提高经济运行质量的问题与对策
- memcache最长有效期是多久?
- 关于thinkphp3.2中使用smarty模板success调转失败的解决办法
- POSIX线程-条件变量(一)
- 注册机的使用
- 集群技术(三)MySQL集群深度解析
- JDBC
- 企业监控与信息管理强大助手-逐浪舆情系统交付商用
- 集群技术(三)MySQL集群深度解析