您的位置:首页 > 编程语言

高级编程之线程(一)

2016-01-22 14:10 204 查看
线 程

线程 ===》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 将该文件压缩并单独备份。

在执行过程中最好有日志记录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: