线程控制(一)

、线程的概念
       一个进程要完成两个任务,而一个阻塞使另一个也无法执行。所以线程就是将一个进程所要做的来两个任务分成两个线程来完成,从而一个任务的阻塞不会影响到后面任务的完成。换句话说,线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列: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结束,则进程结束,所有的函数线程都将结束。