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.\n",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("进入主线程.\n");
25     for(i=0;i<NUM_PTHREAD;i++)
26     {
27         printf("创建线程%d.\n",i);
28         ret = pthread_create(&th[i],NULL,fun,(void *)i);
29         if (ret != 0)
30         {
31             printf("线程%d创建失败.errno=%d.\n",i,errno);
32             return -1;
33         }
34     }
35     printf("主线程退出!\n");
36     pthread_exit(NULL);
37     return 0;
38 }
39                  

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

  

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

  

 

posted @ 2017-01-03 20:25  波子木木  阅读(486)  评论(0编辑  收藏  举报