操作系统实验5线程管理与控制Word格式.docx
- 文档编号:8658872
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:10
- 大小:131.12KB
操作系统实验5线程管理与控制Word格式.docx
《操作系统实验5线程管理与控制Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验5线程管理与控制Word格式.docx(10页珍藏版)》请在冰点文库上搜索。
正如进程之间可以用wait()系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join()函数。
pthread_join()可以用于将当前线程挂起来等待线程的结束。
这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回。
(1)创建线程函数pthread_create()
功能:
创建线程和启动线程,与进程管理函数fork()的功能相似。
pthread_create()函数语法要点
所需头文件
#include<
pthread.h>
函数原型
intpthread_create(pthread_t*thread,pthread_attr_t*attr,
void*(*start_routine)(void*),void*arg))
函数传入值
thread:
线程标识符
attr:
线程属性设置(其具体设置参见9.2.3小节),通常取为NULL
start_routine:
线程函数的起始地址,是一个以指向void的指针作为参数和返回值的函数指针
arg:
传递给start_routine的参数
函数返回值
成功:
出错:
返回错误码
(2)线程退出函数pthread_exit()
pthread_exit()函数语法要点
voidpthread_exit(void*retval)
retval:
线程结束时的返回值,可由其他函数如pthread_join()来获取
(3)等待线程结束函数pthread_join()
等待线程结束,读取线程的返回结果。
pthread_join()函数语法要点
intpthread_join(pthread_tth,void**thread_return)
th:
等待线程的标识符
thread_return:
用户定义的指针,用来存储被等待线程结束时的返回值(不为NULL时)
(4)线程取消函数pthread_cancel()
pthread_cancel()函数语法要点
intpthread_cancel((pthread_tth)
要取消的线程的标识符
4.3.3Linux多线程同步API
1.线程同步信号量及系统调用
POSIX的线程同步信号量定义了3个函数:
(1)信号量初始化
函数说明:
semaphore.h>
intsem_init(sem_t*sem,intpshared,unsignedvalue);
参数说明:
sem:
指向信号量变量的指针,*sem是定义好的信号量。
pshared:
为0表示进程局部信号量,通常为0
value:
信号量初始值,为1时是二值信号量
返回值:
0:
执行成功,非0执行失败
(2)信号量加1原子操作
intsem_post(sem_t*sem);
说明:
类似于进程的V操作。
(3)信号量减1原子操作
intsem_wait(sem_t*sem)
在信线程号量值为0时执行该操作使线程进入等待状态,直到另一个线程执行加1原子操作为止。
类似于进程的P操作。
2.线程互斥量及系统调用
互斥量可在多线程程序中作为临界区互斥访问手段。
操作互斥量的基本函数有:
(1)初始化函数
intphread_mutex_init(pthread_mutex_t*mutex,
constpthread_mutexattr_t*mutexattr));
mutex:
定义好的互斥量指针
mutexattr:
互斥量属性,通常可以为NULL
(2)加锁操作
intpthread_mutex_lock(pthread_mutex_t*mutex);
(3)开锁操作
intpthread_mutex_unlock(pthread_mutex_t*mutex);
(4)互斥量撤销操作
intpthread_mutex_destroy(pthread_mutex_t*mutex);
4.3.4Linux多线程同步实验任务
1.用互斥量实现对4.3.2中多线程并发程序中共享变量的互斥访问。
lin-thread-4.c:
stdio.h>
unistd.h>
staticinta[10000];
staticsum1,sum2,sum,p;
pthread_mutex_tmutex;
//互斥量,用于共享变量访问
void*thread1(void*arg)
{
inti;
sum2=0;
for(;
;
){
pthread_mutex_lock(&
mutex);
if(p<
10000){
sum2=sum2+a[p];
usleep
(1);
p++;
pthread_mutex_unlock(&
}
else{
pthread_mutex_unlock(&
break;
}
pthread_exit((void*)sum2);
intmain(intargc,char*argv[])
pthread_ttidp;
interror,i;
intres;
intthread_result;
pthread_mutex_init(&
mutex,NULL);
//线程互斥量初始化为
p=0;
for(i=0;
i<
10000;
i++)a[i]=i;
error=pthread_create(&
tidp,NULL,thread1,NULL);
if(error!
=0)
{
printf("
threadisnotcreated...\n"
);
return-1;
sum1=0;
sum1=sum1+a[p];
pthread_join(tidp,&
thread_result);
sum=sum1+sum2;
thesumofarray[10000]is%d\n"
sum);
printf("
thepartsumofthread1getis%d\n"
thread_result);
return0;
$gcclin-thread-4.c-lpthread-olin-thread-4
$./lin-thread-4
2.分析、调试和执行一个多线程示例程序lin-thread-5.c
该程序创建两个线程,一个线程负责读入键盘输入的文本,另一个线程负责统计和显示输入的字符个数,文本输入以“end”表示输入结束。
程序在主线程中对结束的两个线程进行归并。
lin-thread-5.c
stdlib.h>
string.h>
void*input_text(void*arg);
void*count_text(void*arg);
void*stat_text(void*arg);
sem_tbin_sem;
//信号量,用于线程同步
#defineWORK_SIZE1024
charwork_area[WORK_SIZE];
intmain(){
//线程函数执行的返回值
pthread_tinput_thread,stat_thread;
//线程标识符变量
void*thread_result;
//线程执行的返回值
res=sem_init(&
bin_sem,0,0);
//线程同步信号量初始化为0
if(res!
=0){
perror("
Semaphoreinitfailed"
exit(EXIT_FAILURE);
res=pthread_create(&
input_thread,NULL,input_text,NULL);
InputThreadinitfailed"
stat_thread,NULL,stat_text,NULL);
StatThreadinitfailed"
Waitingforthreadtofinish…\n"
res=pthread_join(input_thread,&
res=pthread_join(stat_thread,&
Threadsjoined\n"
sem_destroy(&
bin_sem);
exit(EXIT_SUCCESS);
void*input_text(void*arg){
Inputsometext.Enter‘end’tofinish\n"
while(strncmp("
end"
work_area,3)!
fgets(work_area,WORK_SIZE,stdin);
sem_post(&
/*产生事件*/
pthread_exit(0);
void*stat_text(void*arg){
sem_wait(&
/*等待事件*/
Youinput%dcharacters\n"
strlen(work_area)-1);
pthread_exit(NULL);
$gcc-D_REENTRANTlin-thread-5.c-olin-thread-5-lpthread
$./lin-thread-5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 线程 管理 控制
![提示](https://static.bingdoc.com/images/bang_tan.gif)