线程控制(一)
一、线程的概念
一个进程要完成两个任务,而一个阻塞使另一个也无法执行。所以线程就是将一个进程所要做的来两个任务分成两个线程来完成,从而一个任务的阻塞不会影响到后面任务的完成。换句话说,线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main 的执行体。进程可以通过线程库创建 N 条线程,这些新创建的线程称之为函数线程, main 函数所代表的线程为主线程。
二、线程与进程的区别:
1、进程是资源分配的最小单位,线程是 CPU 调度的最小单位;
2、线程是轻量级的进程,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度;
3、管理方式不同,进程是 PCB 管理,线程是由线程结构管理;
4、进程间相互独立,同一进程的各线程间共享。
三、线程实现的三种方式
1、用户态
用户态线程实现(n:1)
优点:
1)灵活性,操作系统不知道线程的存在,所以在任何操作系统都能应用;
2)线程切换快,切换在用户态进行;
3)不用修改操作系统,实现容易。
缺点:
1)编程序变得很诡异,用户态线程需要相互合作才能运转,在什么时候应该让出CPU给别的线程使用,这个时机很难把握;
2)用户态线程实现无法完全达到线程提出所要达到的目的:进程多道编程。
2、内核态
内核态线程实现(n:n)
优点:
1)用户编程保持简单,线程的复杂性由操作系统承担;
2)如果一个线程执行阻塞操作,操作系统可以从容的调度另外一个线程操作。
缺点:
1)效率较低;
2)内核态实现占用内核稀缺的内核资源,因为操作系统需要维持线程表。操作系统的内存在装载后是固定的,当线程数量越来越多时,操作系统的内核会迅速被用尽。
3)内核态的实现需要修改操作系统
3、混合型
线程的内核态与用户态混合实现(n:m)
四、 线程的创建:
int pthread_create(pthread_t *id, pthread_attr_t *attr, void* (*fun)(void*), void *arg);
第一个参数是指向pthread_t类型数据的指针;
第二个参数用于设置线程的属性,一般设置为NULL;
第三个参数是线程将要启动执行的函数;
第四个参数是传递给该函数的参数。
包含线程创建函数的源代码要想生成可执行文件,必须: gcc -o pthread pthread.c-lpthread
线程结束:
int pthread_exit(void*); //参数可以设置线程结束状态
等待线程结束:
intpthread_join(pthread_t id, void**); //可以获取到等待的线程通过 pthread_exit 设置的结束状态信息
程序中包含头文件:pthread.h
线程函数传参:
1、 将值强转成 void* int a=(int)arg;
2、 将地址强转成 void* int a=*(int*)arg;
注意:函数线程创建出来以后,函数线程与主线程同时执行,主线程以exit结束,则进程结束,所有的函数线程都将结束。