zoukankan      html  css  js  c++  java
  • Linux学习笔记(16)-多线程

      什么是多线程?或者说,什么是线程?

      按照书本上的描述,所谓线程,便是包含在进程内部的顺序执行流,是进程中实际运作的单位,也是操作系统能够进行调度的最小单位。

      一个进程中可以并发多条线程,每条线程并行执行不同的任务。

      在以往的单片机裸机编程中,程序的执行永远都有一个确定的路径,从开始到结束,完全是在我们的控制下……

      按照我自己的话来讲,一个线程就是一个能够独立运行的程序。三条线程就是三个独立运行的程序,在宏观上来看,相当于用一个CPU做了三个CPU的工作。

       ……
      线程与进程的关系:

      1.一个线程只能属于一个进程,而一个进程可以拥有多个线程,但必然有且只有一个住线程

      2.操作系统将资源分配给进程,一个进程中的所有线程共享进程中的资源

      3.线程不拥有资源,它是作为调度和运行的基本单位,进程作为拥有资源的基本单位

      为什么不用进程代替线程?

      1.进程作为拥有资源的基本单位,系统在创建活撤销进程的时候,都会耗费很大的开销,而线程的开销则要小得多。

      2.进程间通信很费劲,而线程由于资源共享,通信极为简单

      3.执行效率更高

      ——————————————————————————————————————————————————————————————

      创建线程

      在进程中创建一个线程的函数是pthread_create()

      原形:int pthread_create(pthread_t * thread, const pthread_attr * attr, void *(start_routine)(void *), void *arg)

      说明:如果线程创建成功,函数返回0,并将会立即执行。如果创建失败,函数返回一个非0的数

      参数:

      thread 用来指向创建新线程的ID

      attr用来设置线程的基本属性,如果是NULL,那么线程就使用默认属性

      start_routine是线程开始时所执行的函数,第四个参数arg就是他的参数

      线程终止

      终止一个线程可以使用函数pthread_exit()

      原形:pthread_exit(void * retval)

      参数是一个无类型的指针,可以将线程的返回值当做函数pthread_exit()的参数传入

      实战演练!!

      创建五个线程,分别打印出自己的线程ID

      代码如下:

      重点:在编译线程相关的代码时,要在编译选项中加上-pthread  

          

     1 #include<pthread.h>
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<errno.h>
     5 
     6 
     7 #define NUM_PTHREAD 5
     8 
     9 void *fun(void *pthreadid)
    10 {
    11     int id;
    12 
    13     id=(int)pthreadid;
    14     printf("线程ID为:%d.
    ",id);
    15     pthread_exit(NULL);
    16 }
    17 
    18 
    19 int main(void)
    20 {
    21     pthread_t th[NUM_PTHREAD];
    22     int ret,i;
    23 
    24     printf("进入主线程.
    ");
    25     for(i=0;i<NUM_PTHREAD;i++)
    26     {
    27         printf("创建线程%d.
    ",i);
    28         ret = pthread_create(&th[i],NULL,fun,(void *)i);
    29         if (ret != 0)
    30         {
    31             printf("线程%d创建失败.errno=%d.
    ",i,errno);
    32             return -1;
    33         }
    34     }
    35     printf("主线程退出!
    ");
    36     pthread_exit(NULL);
    37     return 0;
    38 }
    39                  

      编译之后,执行结果如下:

      

      注意:由于操作系统调度的线程随机性,执行结果可能与我的现象不一致!

      

  • 相关阅读:
    MSP430的CAN通信发送
    Arduino 101/Genuino101使用-第2篇
    CC2541调试问题记录-第一篇
    STM32运行FreeRTOS出现prvTaskExitError错误死机
    Arduino 101/Genuino101使用-第一篇
    LAUNCHXL-28379D入门学习-第一篇
    蒸汽机的原理
    等高线相似性匹配
    cad转shapefile文件
    ArcGIS坐标转换
  • 原文地址:https://www.cnblogs.com/han-bing/p/6246175.html
Copyright © 2011-2022 走看看