操作系统实验5线程管理与控制Word格式.docx

上传人:b****6 文档编号:8658872 上传时间:2023-05-12 格式:DOCX 页数:10 大小:131.12KB
下载 相关 举报
操作系统实验5线程管理与控制Word格式.docx_第1页
第1页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第2页
第2页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第3页
第3页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第4页
第4页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第5页
第5页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第6页
第6页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第7页
第7页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第8页
第8页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第9页
第9页 / 共10页
操作系统实验5线程管理与控制Word格式.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验5线程管理与控制Word格式.docx

《操作系统实验5线程管理与控制Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验5线程管理与控制Word格式.docx(10页珍藏版)》请在冰点文库上搜索。

操作系统实验5线程管理与控制Word格式.docx

正如进程之间可以用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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2