zoukankan      html  css  js  c++  java
  • linuxC线程pthread的相关理解

    1. 线程概念
      Linux里的线程,也叫轻量级进程(light weight process),本质上是进程。
      Linux早期是没有线程的,后来的线程是借助进程实现的。线程、进程的核心都是调用系统的clone方法实现。
      线程和进程的区别:(说明:PCB即进程控制块)
        进程拥有PCB,用于独立的地址空间。是操作系统最小资源分配单位。(独居地址空间)
        线程也有PCB,但没有独立的地址空间,共享同一个地址空间。是操作系统最小执行单位。(合租地址空间)
      
      Linux内核线程实现原理:
        1)轻量级进程,也有PCB,创建线程使用的底层方法和进程一样都是clone方法。
        2)线程有各自的PCB,但是各自的PCB指向内存资源的三级页表是相同的。所以地址空间是相同的,即共享地址空间。
        3)线程可看作是寄存器和栈的集合。
      三级页表映射:进程PCB -> 页目录(可看作数组,首地址位于PCB里)-> 页表(可看作数组元素) -> 物理页表 -> 内存单元

      线程共享的资源:
        文件描述符、信号处理方式、当前工作目录、用户ID和组ID、内存地址空间(.text/.data/.bss/heap/so)

      线程非共享的资源:
        线程ID、处理器现场和内核栈指针、用户空间栈、errno变量、信号屏蔽字、线程调度优先级、线程调度策略
    2. pthread线程函数
      pthread_t pthread_self(void);//获取线程id,类似于进程的getpid()函数。
      pthread_create(pthread_t* tid, pthread_attr_t* attr, void*(run)(void*), void* arg);//创建一个线程,类似于进程的fork()函数。
        attr参数//线程属性,需要调用pthread_attr_init()函数初始化,然后再设置属性,最后调用pthread_attr_destroy()销毁。
        run参数//是一个函数指针,形式 void* run(void*){},是线程创建成功后的回调函数,该函数执行周期既是线程生命周期,即该函数执行完线程就结束。
        arg参数//run函数的参数。
      pthread_exit();//退出一个线程,类似于进程的exit()函数。
        注意1:任一个线程里调用exit()函数的话,进程退出,导致所有线程都会退出。所以退出一个线程应该调用pthread_exit()函数。
        注意2:主线程return返回后,进程退出了,此时所有的子线程都会退出。
      pthread_join();//主线程阻塞等待子线程退出,并获取子线程退出状态码。类似于进程的wait()函数
      pthread_detach();//使线程处于分离状态,也就是说该线程执行完后自动释放所有资源包括回收PCB。
      pthread_cancel();//杀死、取消一个线程,类似于进程的kill()函数。
        注意:调用该方法可能不会马上杀死,需要到达一个取消点才会杀死。man 7 pthreads 查看取消点。
      pthread_testcancel();//通过代码设置一个取消点。
      pthread_equal();//比较两个线程是否为相同。虽然现在linux线程id是一个unsigned long int,但是其他非linux系统或者后面版本linux可能改为结构体。
      
      终止线程的三种方式:return、pthread_exit()、pthread_cancel()
    3. pthread线程属性
      使用步骤、即初始化、使用、销毁:
        pthread_attr_t attr;
        pthread_attr_init(&attr)
        pthread_create(tid, &attr, callback_fun,callback_arg)
        pthread_destroy(&attr)
      pthread_attr_t结构体属性:
        线程分离:pthread_attr_getdetachstate()、pthread_attr_setdetachstate(PTHREAD_CREATE_DETACHED、PTHREAD_CREATE_JOINABLE)
        线程栈地址:pthread_attr_getstack()、pthread_attr_setstack()
        线程栈大小:pthread_attr_getstacksize()、pthread_attr_setstacksize()   
    4. 安装pthread线程man page手册
      安装命令:sudo apt-get install manpages-posix-dev
      验证安装:man -k pthread 可以列出pthread
      查看当前pthread库的版本:getconf GNU_LIBPTHREAD_VERSION
      使用线程库时,gcc编译需要加上 -lpthread(小写L)
  • 相关阅读:
    什么是webview
    juqery.fn.extend和jquery.extend
    LeetCode
    5. Longest Palindromic Substring
    42. Trapping Rain Water
    11. Container With Most Water
    621. Task Scheduler
    49. Group Anagrams
    739. Daily Temperatures
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/yongfengnice/p/11986612.html
Copyright © 2011-2022 走看看