嵌入式Linux网络编程·笔记7·多线程(未完)

本文介绍了嵌入式Linux中的线程概念,包括线程与进程的区别、线程特点,以及线程创建、等待和退出的相关函数pthread_create、pthread_join和pthread_exit的使用方法和示例。
摘要由CSDN通过智能技术生成

线程·概述

1、线程是任务调度和执行的基本单位。

2、进程实现多任务

缺点:

  1)进程间切换的计算机资源开销很大,切换效率非常低 。

  2)进程间数据共享的开销也很大(系统资源消耗快)。

3线程和进程的关系

  (1)定义:线程是进程的一个执行单元(一个进程中可有多个线程),是进程内的调度实体。是比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

  (2)空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。

  (3)直接关系:进程退出,进程中所有线程全部退出;

  (4)一个进程崩溃后,不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

  (5)线程不可能完全替代进程。

  (6)线程拥有独立的属性

          ①每个线程拥有自己独立的线程IDTID);

          ②每个线程有独立的切换状态;

          ③调度优先级;

          ④有自己独立的函数栈;

          ⑤自己独立的错误号;

          ⑥每一个线程有自己独立的信号屏蔽字和未决信号集;

          ⑦每个线程有自己独立的tack_struct结构体。

4、线程的特点:

  (1)线程切换的开销很低,其实质是函数的切换。

  (2)线程通信机制简单,采用全局变量(实现共享)。

5、线程函数是由线程库libpthread.a/.so提供的,并非OS

6、线程控制函数有:pthread_createpthread_join pthread_detachpthread_cancelpthread_exit等。

7、线程库和函数手册的安装

    sudo apt-get install glibc-doc :安装线程库

    sudo apt-get install manpages-posix-dev:安装线程库的函数手册

8、线程操作:线程创建、退出、等待、状态。

9所有线程不共享堆栈段(局部变量),共享数据段(全局变量)。

 

 

线程·函数

二十五、pthread_create(线程创建)

1、头文件:#include<pthread.h>

2、函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

3、函数形参:thread:存放线程的TID;

                       attr:设置线程属性,一般置NULL;

                       start_routine:线程所要执行的函数地址;

                       arg:传递给线程函数的参数。

     注:(1)start_routine是void *型函数,其形参也为void *型。

            (2)arg:这个参数会传递给pth_arg,如果参数很多的话,可做成一个结构体,然后将结构体变量的地址传过去。若不想传递参数,可设置为NULL。

4、函数返回值:成功返回0,失败返回错误号。

5、使用示例:

      注:编译时要链接线程库(libpthread.a/.so):gcc pthread create.c –lpthread

   (1argNULL

 

 

 

2arg有值且为全局变量,实现所有线程共享主线程(进程)的数据段。

 

 

3arg有值且为局部变量,使用地址传参,在调用的函数中必须将void *arg强转为对应的数据类型

 

 

二十六、pthread_join(线程等待)

1、头文件:#include<pthread.h>

2、函数原型:int pthread_join(pthread_t thread, void **retval);

3、函数形参: thread:指定要回收的次线程的TID;

                         retval:次线程函数返回的返回值。

4、函数返回值:成功返回0,失败返回错误号。

5、功能:阻塞等待TID为thread的次线程结束,结束时该函数回收次线程所占用资源。

     注:该函数只对次线程有意义,对主线程无意义,因为主线程结束时整个进程就结束了,而整个进程资源会由父进程回收。

6、等待线程的目的:

  (1)保证线程的退出顺序:保证一个线程退出并且回收资源后允许下一个进程退出

  (2)回收线程退出时的资源情况:保证当前线程退出后,创建的新线程不会复用刚才退出线程的地址空间

  (3)获得新线程退出时的结果是否正确的退出返回值,这个有点类似回收僵尸进程的wait,保证不会发生内存泄露等问题

7、使用示例:result接TID为id、id2的线程退出时的返回值

      注:result在该函数中使用需为void *,而在printf时需要强转为字符串类型。

 

二十七、pthread_cancel/exit(线程退出)

1、头文件:#include<pthread.h>

2、函数原型:

     被动退出:int pthread_cancel(pthread_t thread);

     主动退出:void pthread_exit(void *retval);   //或使用return直接返回

     :pthread_exit类似于exit函数,不过exit是终止整个进程的,而pthread_exit是终止次线程的。如果在次线程里面调用错误,调用的是exit,整个进程就终止了。     

3、函数形参: thread:指定要取消的线程的TID;

                         retval:线程结束时的返回值。

     注:对于retval,如果返回值很多时,就封装成一个结构体,返回结构体变量的地址即可。

4、函数返回值:成功返回0,失败返回非零错误号。

5、使用示例:

(1)被动退出·pthread_cancel

 

(2)主动退出·pthread_exit,使用result接返回值, 会打印出mythread2 exit!

 

(3)主动退出·return,使用result接返回值,会打印出mythread1 exit!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值