高级编程之线程(一)

线  程

 

线程 ===》linux 线程 ===》posix线程 ===》pthread库

1、线程的概念
   线程是一个轻量级的进程
   是一个进程中的多个任务
   它是CPU调度的最小单位


2、线程的特点:
 1、是第三方开发的库 ==》pthread库
    编写时候要包含: pthread.h
    编译的时候要加: -lpthread

 2、资源共享
   线程是进程中的任务,进程中
   的公共资源,线程都可以使用。

 3、执行效率
   同一任务一般线程的执行效率要
   高于进程,同时节省资源。

3、线程与进程的区别:
 1、线程比进程多的共享资源:
   执行的指令  静态数据  文件描述符
 2、线程比进程的私有资源:
   线程id,局部变量  返回地址

 3、线程是CPU调度的最小单位,===》任务
    进程是OS调度的最小单位。 ===》进程

4、线程的使用
 线程的创建  ====》线程的操作  ===》线程的资源回收

 pthread_create    fun/pthread_exit   pthread_join


 4.1 线程的创建
 #include <pthread.h>

 int pthread_create(
   pthread_t     *thread,
   const pthread_attr_t  *attr,
   void *(*start_routine) (void *),
   void      *arg
   );
 功能:通过该函数可以在进程中创建一个线程。
 参数:thread 创建好的线程id
    attr  创建的线程属性,如果不做调整用NULL
    strat_routine  回调函数,表示线程的执行函数
    arg    线程的回调函数的参数
 返回值:成功  0
   失败  -1

 验证:
 1、ps aux   ===>l 表示是多线程程序
 2、pstree  ===>{xxx} 表示进程中的线程名称以及个数。

 pthread_self() 
 原型:pthread_t pthread_self(void);
 功能:通过该函数可以获取当前线程的线程id
    一般该值等于pthread_create的参数1 的值。
 参数: 无
 返回值:成功  获取到的tid
   失败  -1;

 

 4.2 线程的操作:
  void * fun(char *arg) ===>线程执行函数

  ===》pthread_exit()
  void pthread_exit(void *retval);
  功能:线程中用于退出线程的函数
  参数:retval 线程退出时候的返回值
    如果没有则用NULL;
  返回值:无

  pthread_cancel()
  原型:int pthread_cancel(pthread_t thread);
  功能:由创建者进程用来杀死子线程用。
  参数:thread 要结束的子线程tid
  返回值:成功 0
    失败 -1;


 4.3 线程的资源回收
  原型:int pthread_join(pthread_t thread,
                         void **retval);
  功能:在创建线程的进程中执行该函数可以回收
     退出任务的线程资源。
     该函数会阻塞等待回收过程

  参数:thread  要回收的目标线程id
     retvarl 回收的线程退出状态
  返回值:成功 0
    失败  -1

 
练习:设计一个多任务线程程序,对一个公共变量进行
   加法操作并将每个线程执行的结果打印输出。
   包含线程的tid和变量的当前值,判断是否可以
   在多线程中操作公共静态变量。

线程的返回值和传参数:

1、线程的返回值:
  pthread_exit( ?)  ===>pthread_join(?)

   返回值类型:
   1、数字
     1.1
  int * pa = malloc
  *pa = 99;

  void * ret ; pthread_join(tid,&ret);
  *(int *)ret;

  1.2
  return ((void *)a);
  (int)ret;

   2、字符串
  char * pc = malloc
  pc = "asdf"  错误
  strcpy(pc,"asdfasdf"); ///不太好
  strcpy(pc,array);

  pthread_join(tid,&ret);
  printf("ret = %s \n",(char *)ret);


   3、结构体

     1、定义结构体
  2、在子线程中给结构体变量申请空间并赋值
  3、返回结构体指针

  4、在主线程中回收子线程返回值
  5、强制类型转换返回值为结构体类型
  6、打印输出转换后的结构体成员变量

作业:
 1、设计一个结构体,在子线程中给结构体赋值并返回
  在主线程中打印输出结构体返回的成员值。
 
 2、使用IO+线程+进程学习过的知识尝试如下功能:
  将/etc目录中的所有.conf文件定时备份到指定目录
  如果其中有文件大于5M 将该文件压缩并单独备份。
  在执行过程中最好有日志记录。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值