线程

来源:互联网 发布:摩尔定律失效 知乎 编辑:程序博客网 时间:2024/06/17 14:20

一、线程

  1、概念         进程内部的一条执行序列。进程内部至少有一条执行线程,即main函数的执行体。进程内部可以有多条线程,main函数的线程称之为主线程,其他线程称之为函数线程。函数线程是由主线程通过系统调用函数创建的。

 2、与进程的区别:

  (1)进程是资源分配的最小单位,线程是调度(执行)的最小单位

 (2)第9点

 (3)线程切换比进程切换消耗小

3、线程的分类

  (1)用户级:在用户空间是多线程,内核只识别进程整体。线程创建、管理、销毁都是由用户空间负责,用户通过调用库函数再完成。

 (2)内核级:线程的创建、控制、销毁都是由内核实现的,每个线程对内核都是可见的。

 (3)组合模型:一部分是用户级,一部分是内核级线程。介于内核级和用户级之间,用户态创建多个线程,内核看到的也是多个,只是这是中m:n的对应关系。

                                    

4、线程的创建

      通过库函数可以创建线程

      #include<phread.h>

       int pthread_create(pthread_t * id,  pthread_attr * attr, void*(*pthread_fun)(void*), void* agr);

       id:  线程的编号。由系统自动填充;

       attr: 线程属性

       pthread_fun: 线程创建以后所调用的函数地址;

       arg: 传递给函数线程的参数

       总结: [1] pthread_create 函数是库函数,编译的时候必须加载其动态库。

                   [2] 和写一个普通的函数没有明显的差异。只不过是在主线程不会调用函数,而是在创建线程的时候指定                           函数线程执行的代码入口地址(即就是函数的地址)。称主函数为主执行序列,函数的执行为函数线                           程执行流。

                  [3]主线程和函数线程同时执行,一个进程同时执行多个任务。

5、线程的运行特点

                        所有线程同时运行

6、线程退出

    exit 是结束进程的函数,主线程要结束,但是函数线程还在运行,我们主线程就不能调用 exit 结束,必须使用:         void pthread_exit(void *reval);

7、线程等待其他线程结束

       int pthread_join(pthread_t id, void**p);
       作用: 获取指定线程由 pthread_exit 设置的退出信息。
       特性: pthread_join 函数会阻塞直到等待的线程退出。(类比进程控制中的 wait 函数)

8、给函数线程传递参数
      i. 传值
               将变量的值强转成 void* ,函数线程中,对 arg 的值强转成变量的类型。
      ii. 传地址
              将变量的地址强转成 void*,函数线程中,对 arg 的值强转成变量类型的指针,再去取值。
      注意:: 如果是传递变量地址,获取变量值时,必须考虑变量的值是否被改变。
9、线程间的数据共享
          全局变量 共享
          栈区数据 不共享
          堆区 共享
          文件: 共享 同一个进程的线程,使用一个 PCB,只要线程能拿到打开的文件的文件描述符,就可以通过文件                         描述符操作文件。





原创粉丝点击