linux 线程笔记

1.函数接口:
    1.waitpid 
      pid_t waitpid(pid_t pid, int *wstatus, int options);
      功能:
        回收指定的子进程空间
      参数:
        pid:想要回收的进程的PID号
        wstatus:回收子进程结束的状态
        options: 
            0           阻塞回收
            WNOHANG     非阻塞回收
      返回值:
        成功返回回收到的子进程的PID
        失败返回-1 
        没有回收到子进程空间返回0 
    
    注意:
        1.wait可以回收任一子进程空间
        2.waitpid可以回收指定的子进程空间
        3.waitpid可以设定为非阻塞IO回收

2.exec函数族:
    int execl(const char *path, const char *arg, ...
                    /* (char  *) NULL */);
    int execlp(const char *file, const char *arg, ...
                    /* (char  *) NULL */);
    int execle(const char *path, const char *arg, ...
                    /*, (char *) NULL, char * const envp[] */);
    int execv(const char *path, char *const argv[]);
    int execvp(const char *file, char *const argv[]);
    int execvpe(const char *file, char *const argv[],
                    char *const envp[]);
    功能:
        利用进程空间执行另外一份代码

    l:执行新代码时,参数以列表形式传递
    v:执行新代码时,参数以指针数组形式传递
    p:执行新代码时,代码在系统路径PATH下查找

    fork创建子进程空间
    exec利用子进程空间执行一段新的代码
    fork + exec:可以启动一个新的软件代码

3.线程
    线程是一个轻量级的进程,包括创建、调度和回收的整个过程

4.线程的创建:
    1.线程被创建后,独享栈区,共享进程中的文本段、数据段和堆区

      进程是独享 0 - 4G虚拟内存空间,包括文本段、数据段和系统数据段
      线程是独享 8M 栈区空间,其余进程中文本段、数据段、堆区与其余线程共享

5.线程的调度:
    1.宏观并行,微观串行

6.线程的回收
    1.线程执行结束后,回收线程空间,避免产生僵尸线程

7.线程和进程有哪些区别?
    1.进程是系统资源分配的最小单元
    2.线程是CPU任务调度的最小单元

8.多线程和多进程的对比:
    执行效率:
      1.多线程 > 多进程
        多线程位于一个进程空间内部,调度任务时不需要切换进程空间
        多进程空间是独立的,任务调度时CPU需要在不同的进程空间切换,增大系统的资源开销

    通信效率:
      1.多线程 > 多进程 
        多线程位于同一个进程空间内部,共享文本段、数据段、堆区,全局变量、静态变量、字符串常量、malloc空间都是共享的
        多进程空间独立,没有共享空间,多进程间通信需要依赖第三方的文件才能实现通信

    安全性:
      1.多进程 > 多线程
        多进程空间独立,一个进程异常结束,不会影响其余进程的执行
        多线程共享同一进程空间,一个线程异常结束,会导致进程结束,其余线程均无法执行

    通信复杂度:
      1.多进程 > 多线程 
        多线程操作共享空间会引发资源竞争,需要使用互斥锁来解决资源竞争
        多进程空间独立,没有共享空间,不会引发资源竞争,不需要考虑加锁

9.fork
  pthread_create 
  int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
  功能:
    在进程空间内部创建一个线程
  参数:
    thread:存放线程ID空间的首地址
    attr:线程的属性空间首地址  (默认传NULL)
    start_routine:线程要执行的函数的地址
    arg:对线程函数传递的参数
  返回值:
    成功返回0 
    失败返回非0 
  
  注意:
    1.编译时需要加-lpthread链接线程库
      gcc filename.c -lpthread 

  exit 
  pthread_exit 

  wait 
  pthread_join

  pthread_self

相关推荐

  1. linux 线笔记

    2023-12-12 14:22:03       37 阅读
  2. LINUX自启动线学习笔记

    2023-12-12 14:22:03       37 阅读
  3. Linux C编程实战》笔记线终止

    2023-12-12 14:22:03       24 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-12 14:22:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-12 14:22:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-12 14:22:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-12 14:22:03       18 阅读

热门阅读

  1. python elasticsearch 日期聚合

    2023-12-12 14:22:03       25 阅读
  2. 利用flask将yolov5算法封装成在线推理服务

    2023-12-12 14:22:03       43 阅读
  3. Windows server flask

    2023-12-12 14:22:03       36 阅读
  4. 2024年软考高项还是机考吗?附常见问题答疑

    2023-12-12 14:22:03       33 阅读
  5. 816 - Abbott‘s Revenge (UVA)

    2023-12-12 14:22:03       42 阅读