线程,我自己看到的两篇讲解比较生动形象的易于理解的博文,如下。
- 线程与进程之间的关系:
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html - 对线程的理解(一篇比较生动形象的讲解):
http://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=403498894&idx=2&sn=219c1a6001b5bb7e6bdc7963b1af8450&scene=2&srcid=0330UDNmQ
linux操作系统是支持多线程的,它在一个进程内生成了许多个线程。一个进程可以拥有一至多个线程。多线程相对于多进程还是有不少优点的:
- 在多进程的情况下,每个进程都有自己独立的地址空间,而在多线程的情况下,同一进程内的的线程共享进程的地址空间。因此,创建一个新的进程时就要耗费时间来为其分配系统资源,而创建一个新的线程花费的时间就很少。
- 在系统调度方面,由于进程地址空间独立而线程共享地址空间,线程间的切换速度要远远快过进程间的切换速度。
- 在通信机制方面,进程间的数据空间相互独立,彼此通信要以专门的通信方式进行,通信时必须经过操作系统。而同一进程内的多个线程共享数据空间,一个线程的数据可以直接提供给其他线程使用,而不必经过操作系统。所以,线程间的通信更加方便和省时。
- 可以提高应用程序的响应速度。
- 可以提高多处理器的效率。
- 可以改善程序的结构。对于要处理多个命令的应用程序,可以对每个命令的处理设计成一个线程,从而避免设计成大程序时造成的程序结构复杂。
虽然线程在进程内共享地址空间,打开的文件描述符等资源。但是线程也有其私有的数据信息。
- 线程号:每个线程都有一个唯一的线程号一一对应。
- 寄存器
- 堆栈
- 信号掩码
- 优先级
线程私有的存储空间
注意:编写linux下的多线程应用程序,需要头文件pthread.h,编译时需要加上-lpthread
1、创建线程:
线程的创建通过函数pthread_creat来完成。
(1) 该函数声明及头文件如下:
#include<pthread.h>
int pthread_create(pthread_t *thread,pthread_attr_t *attr,
(void*)(*start_routine)(void*),void *arg);
编译链接参数
-lpthread
(2)返回值
若线程创建成功,则返回0。若线程创建失败,则返回出错编号。
返回成功时,由thread指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。新创建的线程从start_routine函数的地址开始运行,该函数只有一个万能指针参数arg,如果需要向start_routine函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
- thread:该参数为指向线程标识符的指针,当线程创建成功时,用来返回创建的线程id
- attr:该参数用来指定线程属性,NULL表示使用默认属性。
- start_routine:该参数是一个函数指针,指向线程创建后要调用的函数。
- arg:该参数指向传递该线程函数的参数。
(3)第二个参数是一个指向pthread_attr_t结构体(线程属性结构)的指针,该结构体如下:
typedef struct
{
int detachstate; // 线程的分离状态