多线程程序设计---1
2016-04-11 22:41
351 查看
一、什么是线程
1.线程就是“轻量级”的进程。
2.线程与创建它的进程共享代码段,数据段。
3.线程拥有自己独立的栈。
二、函数学习
1创建线程
1).函数名
2).函数原型
3).函数功能
创建一个新的线程
4).所属头文件
<pthread.h>特别注意:编译时候必须链接pthread库
gcc–lpthread
5).返回值
成功:0
失败:错误编码
6).参数说明
thread:新创建的线程ID
attr:待创建线程的属性,一般为NULL
start_routine:线程的入口函数
arg:线程入口函数的参数,可以为NULL
2等待线程结束
1).函数名
2).函数原型
3).函数功能
用于等待线程结束
4).所属头文件
<pthread.h>特别注意:编译时候必须链接pthread库
gcc–lpthread
5).返回值
成功:0
失败:错误编号
6).参数说明
thread:要等待结束的线程id
retval:保存线程退出时的状态,一般为NULL
3退出线程
1).函数名
2).函数原型
3).函数功能
结束线程
4).所属头文件
<pthread.h>特别注意:编译时候必须链接pthread库
gcc–lpthread
5).返回值
空
6).参数说明
retval:保存返回值
三、线程互斥
在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)是互斥机制中的一种。
3.1互斥锁初始化
1).函数名
2).函数原型
3).函数功能
初始化互斥锁
4).所属头文件
<pathread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要初始化互斥锁的指针
attr:可以添加的属性,为空则为默认属性
3.2获取互斥锁
1).函数名
2).函数原型
3).函数功能
锁住互斥锁
4).所属头文件
<pthread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要锁住互斥锁的指针
3.3释放互斥锁
1).函数名
2).函数原型
3).函数功能
解开互斥锁
4).所属头文件
<pthread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要解开互斥锁的指针
四、实例学习
通过主函数创建两个进程,使这两个进程交互完成一项任务
1.线程就是“轻量级”的进程。
2.线程与创建它的进程共享代码段,数据段。
3.线程拥有自己独立的栈。
二、函数学习
1创建线程
1).函数名
pthread_create
2).函数原型
intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg)
3).函数功能
创建一个新的线程
4).所属头文件
<pthread.h>特别注意:编译时候必须链接pthread库
gcc–lpthread
5).返回值
成功:0
失败:错误编码
6).参数说明
thread:新创建的线程ID
attr:待创建线程的属性,一般为NULL
start_routine:线程的入口函数
arg:线程入口函数的参数,可以为NULL
2等待线程结束
1).函数名
pthread_join
2).函数原型
intpthread_join(pthread_tthread,void**retval)
3).函数功能
用于等待线程结束
4).所属头文件
<pthread.h>特别注意:编译时候必须链接pthread库
gcc–lpthread
5).返回值
成功:0
失败:错误编号
6).参数说明
thread:要等待结束的线程id
retval:保存线程退出时的状态,一般为NULL
3退出线程
1).函数名
pthread_exit
2).函数原型
voidpthread_exit(void*retval)
3).函数功能
结束线程
4).所属头文件
<pthread.h>特别注意:编译时候必须链接pthread库
gcc–lpthread
5).返回值
空
6).参数说明
retval:保存返回值
三、线程互斥
在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入线程互斥机制,而互斥锁(mutex)是互斥机制中的一种。
3.1互斥锁初始化
1).函数名
pthread_mutex_init
2).函数原型
intpthread_mutex_init(pthread_mutex_t*restrictmutex,constpthread_mutexarrt_t*restrictattr);
3).函数功能
初始化互斥锁
4).所属头文件
<pathread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要初始化互斥锁的指针
attr:可以添加的属性,为空则为默认属性
3.2获取互斥锁
1).函数名
pthread_mutex_lock
2).函数原型
intpthread_mutex_lock(pthread_mutex_t*mutex);
3).函数功能
锁住互斥锁
4).所属头文件
<pthread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要锁住互斥锁的指针
3.3释放互斥锁
1).函数名
pthread_mutex_unlock
2).函数原型
intpthread_mutex_unlock(pthread_mutex_t*mutex);
3).函数功能
解开互斥锁
4).所属头文件
<pthread.h>
5).返回值
成功:0
失败:错误的编码
6).参数说明
mutex:要解开互斥锁的指针
四、实例学习
通过主函数创建两个进程,使这两个进程交互完成一项任务
1#include<pthread.h> 2#include<string.h> 3#include<stdio.h> 4 5pthread_tthread[2]; 6intnumber=0; 7 8pthread_mutex_tmut; 9 10void*worker1() 11{ 12inti=0; 13printf("Iamworker1\n"); 14for(i=0;i<10;i++) 15{ 16pthread_mutex_lock(&mut); 17number++; 18pthread_mutex_unlock(&mut); 19printf("worker1numberis%d\n",number); 20sleep(1); 21} 22pthread_exit(NULL); 23} 24 25 26void*worker2() 27{ 28inti=0; 29printf("Iamworker2\n"); 30for(i=0;i<10;i++) 31{ 32pthread_mutex_lock(&mut); 33number++; 34pthread_mutex_unlock(&mut); 35printf("worker2numberis%d\n",number); 36sleep(1); 37} 38pthread_exit(NULL); 39} 40 41intmain() 42{ 43pthread_mutex_init(&mut,NULL); 44 45//创建工人1线程 46pthread_create(&thread[0],NULL,worker1,NULL); 47 48//创建工人2线程 49pthread_create(&thread[1],NULL,worker2,NULL); 50 51//等待工人1线程结束 52pthread_join(thread[0],NULL); 53 54//等待工人2线程结束 55pthread_join(thread[1],NULL); 56 57 58return0; 59}
相关文章推荐
- bind函数解析
- hdu 1847 Good Luck in CET-4 Everybody!
- Hadoop大数据零基础高端实战培训系列配文本挖掘项目
- 广东工业大学2016校赛决赛重现——E积木积水(方法据说很多)
- IOS学习 网络 User-Agent 换行/r/n最安全 url汉字转换
- mxGraph Web在线绘图
- JavaScript基础教程04Math对象介绍
- 创业者要处理好的10大关系
- Hadoop大数据零基础高端实战培训系列配文本挖掘项目
- 网络安全——数据的加密与签名,RSA介绍
- Example017简单的下拉框
- iOS UITextView 根据输入text自适应高度
- JavaScript开发的技巧
- Android 多线程及线程通信
- c++中sort()及qsort()的用法总结
- hihocoder #1270 建造基地
- hihocoder 1149 : 回文字符序列(区间dp)
- C# DataGridView添加右键菜单等技巧
- 图论(网络流):COGS 410. [NOI2009] 植物大战僵尸
- 编译原理-用FLEX构造词法分析程序