zoukankan      html  css  js  c++  java
  • 线程

    关于多线程,需要看https://blog.csdn.net/column/details/killthreadseries.html
    大神写的专题
     
     
    1.线程概念
      线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源,如打开文件和信号。
    2.模型
       多对一     一对一     多对多
     
    3.线程支持:
       用户层的用户线程:受内核支持,无需内核管理
       内核层的内核线程:操作系统直接支持和管理
     
    4.线程库
       为程序员提供创建和管理线程的API
    (1)在用户空间提供没有内核支持的库,所有代码和数据结构都存放于用户空间;调用库的一个函数只是导致了用户空间中的一个本地函数调用
    (2)执行一个由操作系统直接支持的内核级的库。库的代码和数据结构存在于内核空间。调用库的一个API通常会导致对内核的系统调用。
       常用线程库:POSIX Pthread         Win32           Java
     
    5.线程取消:
       在线程完成之前终止线程的任务。分为异步取消(一个线程立即终止目标线程)和延迟取消(目标线程不断检查自己是否应该终止,这使其有机会以有序方式终结自己)。    Ps:要取消的线程通常称为目标线程。
     
    6. 信号处理
        作用:通知进程某个特定事件发生。
        特点:由特定事件的发生所产生,产生的信号要发送到进程,一旦发送,信号必须加以处理。
        处理:(1)默认信号处理程序;    (2)用户定义的信号处理程序。
     
    7.线程池:
       在进程开始时创建一定数量的线程,并放入池中等待工作。当服务器收到请求时,它会唤醒池中的一个线程(如果有可以用的线程),并将要处理的请求传递给它。一旦线程完成了任务,它会返回池中再等待工作。如果池中没有可用的线程,那么服务器会一直等待直到有空线程为止。
     
    8.线程特定数据
       同属一个进程的线程共享进程数据。但在有些情况下每个线程可能需要一定数据的自己的副本,这种数据称为线程特定数据。
     
    9.调度程序激活(解决用户线程库与内核间通信)
       许多多对多or二级模型的系统在用户和内核线程之间设置一种中间数据结构(通常是轻量级进程(LWP))。for用户线程库,LWP为一种应用程序可以调度用户线程的虚拟处理器。每个LWP与内核线程相连,该内核线程被操作系统调度到物理处理器运行。若内核线程阻塞,LWP也阻塞,与LWP相连的用户线程也阻塞。
    10.Linux线程
       clone()创建线程
       clone()被调用时,他被传递一组标志,决定父任务与子任务之间发生多少共享。

     eg:将上述四个标志传递给clone(),父任务与子任务之间将共享all of the list items。

    11.Pthread
     
     1 #include<pthread.h>
     2 #include<stdio.h>
     3  
     4 int sum;
     5 void* runner(void *param);
     6  
     7 int main(int argc, char*argv[])
     8 {
     9   pthread_t tid;   //声明所创建的线程的标识符
    10   pthread_attr_t attr; //表示线程属性
    11   
    12   if(argc!=2){
    13      fprintf(stderr,"usage:a.out<integer value>
    ");
    14      return -1;
    15   }
    16  
    17   if(atoi(argv[1]<0){
    18      fprintf(stderr,"%must be <=0
    ",atoi(argv[1]));
    19      return -1;
    20   }
    21  
    22   pthread_attr_init(&attr);   //设置线程属性
    23   pthread_create(&tid,&attr,runner,argv[1]);  //创建一个独立线程,传递线程标识符,线程属性,函数名称,命令行参数argv[1]所提供的整数参数
    24   pthread_join(tid,NULL);     //父进程调用该函数,等待runner()线程的完成
    25   
    26   printf("sum=%d
    ",sum);   
    27 }
    28  
    29 /*/
    30 void *runner(void *param)
    31 {
    32   int i,upper=atoi(param);
    33   sum=0;
    34  
    35   for(i=1;i<=upper;i++)
    36     sum+=i;
    37  
    38   pthread_exit(0);    //累加和线程在调用该函数之后就完成了
    39 }
     
  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/dzy521/p/9144761.html
Copyright © 2011-2022 走看看