linux线程知识总结以及进线程的对比

线程:线程是系统调度的基本单位,是进程的子任务,用于保证程序的实时性,实现进程内部的并发。

 

1.线程的资源组成:

(1)线程的创建仅仅只是创建属于自已线程的栈空间来储存局部变量(临时变量),而与同进程的其他线程共享地址空间,包括代码段、数据段、bss段和堆段以及打开的库文件、mmap映射的地址空间、共享内存空间。 -->带来的是同步的问题

(2)Linux内核是不区分进线程的,如创建进程一样,创建线程时内核也会给线程分配一个PCB来标识这个线程;

(3)Extern int pthread_creat( pthread_t *restrict_newthread, _const pthread_attr_t, void *(*_start_routine)(void *), void * _restrict _arg )   传入四个参数:线程ID(作为输出型参数返回);  栈属性相关的参数设置;  线程运行代码的起始地址,也就是函数指针;  函数指针的参数(如果想传入多个参数,则只能使用结构体指针来进行传递);

(4)线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。

 

2.线程的私有数据:

线程私有的全局变量的实现:使用同名但是不同内存地址的线程私有数据结构,这个数据结构由Posix线程库维护,称为线程的私有数据TSD。

(1)首先创建全局变量:pthread_key_creat();

(2)然后在各个线程中使用pthread_setspecific()在线程库中写入属于自己线程的数据,使用pthread_getspecific()进行数据的读出。

(3)在进程结束时使用pthread_key_deleet()函数进行释放删除。

 

3.线程间通讯的方式

信号量和信号(进程也使用)、互斥锁和互斥量、条件变量、读写锁、临界区。

 

4.线程同步的方式:
(1)互斥锁:以排他的形式防止共享数据被并发(同一时间,多个线程)的访问:

①定义全局变量:pthread_mutex_t mutex;

②初始化互斥锁:pthread_mutex_init();

③在需要的时候上锁:阻塞 pthread_muetxlock()  非阻塞pthread_mutex_trylock();

④使用完进行解锁:pthread_mutex_ublock(),然后其他的线程进行抢占,上锁解锁;

⑤进程结束进行销毁:pthread_mutex_destory()

注:大家一起等厕所,抢占式,谁抢到则进门上锁上厕所,完成后出门解锁,然后剩余的人(包括自己)再次进行抢占。

 

(2)条件变量(必须与互斥锁一起使用):符合规定的条件再去执行相应的事件:

①初始化条件变量:Pthread_cond_init();

②阻塞等待条件变量:pthread_cond_wait()  指定时间等待 pthread_cond_timewait();

③等待完成,通知等待该条件变量的线程:通知等待的第一个线程pthread_cond_signal()  通知等待的所有线程pthread_cond_broadcast();

条件变量的使用需先申请互斥锁,然后在完成条件变量的等待,执行相应的操作之后解锁互斥锁。

注:大家一起等厕所抢占式, 谁抢到则进门上锁上厕所,然后在厕所中等到时机合适了再进行规定的操作,完成具体的操作后出门解锁,然后剩余的人(包括自己)再次进行抢占。

 

(3)读写锁:实现读写的并发执行:

当前线程对某一文件进行读操作,则其他的线程可以申请读操作,但是不可写操作;

当前线程对某一文件进行写操作,则不允许对其他的进程进行任何读写操作。

 

 

linux进线程的对比:

1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在;

2.进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量);

3.进程是资源分配的最小单位,线程是CPU调度的最小单位;

4.系统开销:进程切换的开销也远大于线程切换的开销。在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。

5.通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预;  进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要线程同步和互斥手段的辅助,以保证数据的一致性。

6.进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。

7.进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉。

8.进程适应于多核、多机分布;线程适用于多核。

你可能感兴趣的:(linux的应用层开发)