Linux系统编程(第八章 线程) (2).pdf

上传人:asd****56 文档编号:70331122 上传时间:2023-01-19 格式:PDF 页数:16 大小:509.86KB
返回 下载 相关 举报
Linux系统编程(第八章 线程) (2).pdf_第1页
第1页 / 共16页
Linux系统编程(第八章 线程) (2).pdf_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《Linux系统编程(第八章 线程) (2).pdf》由会员分享,可在线阅读,更多相关《Linux系统编程(第八章 线程) (2).pdf(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第八章:第八章:线程线程目标目标:本章旨在向学员介绍本章旨在向学员介绍linuxlinux操作操作系统下线程的使用:系统下线程的使用:1 1)了解)了解linuxlinux系统下线程与进系统下线程与进程的区别程的区别2 2)掌握线程相关的编程方法)掌握线程相关的编程方法3 3)掌握线程间通信同步的机制)掌握线程间通信同步的机制时间:时间:3.5 学时学时教学方法:讲授教学方法:讲授PPT、实例练习实例练习8.1 什么是线程?什么是线程?定义一个程序中的多个执行路线就叫线程一个程序中的多个执行路线就叫线程(thread)线程是一个进程内部的控制序列线程是一个进程内部的控制序列,进程至少有一个进程

2、至少有一个执行线程执行线程不同调用调用forkfork创建的进程拥有自己的变量和创建的进程拥有自己的变量和PIDPID,时间,时间调度也独立,进程中创建线程时,新的线程拥有自调度也独立,进程中创建线程时,新的线程拥有自己的栈,与它的创建者共享全局变量、文件描述符、己的栈,与它的创建者共享全局变量、文件描述符、信号句柄等资源信号句柄等资源特点线程执行开销小,但不利于资源的管理和保护线程执行开销小,但不利于资源的管理和保护8.2 线程线程pthread_create()函数创建一个新线程,类似于创建新进程的fork函数参数thread:线程创建时,这个指针指向变量中被写入一个标识符,标识符来引用新

3、线程参数attr:用于设置线程的属性参数start_routine:指定线程将要执行的函数参数arg:要执行函数传递的参数#include int pthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);8.2 线程线程线程终止函数pthread_exit#include void pthread_exit(void*retval);8.2 线程线程收集线程函数pthread_join作用等价于进程中用来收集子进程信息的wait函数。参数th:指定将要等待的线程参数th

4、read_return:指向线程的返回值#include int pthread_join(pthread_t th,void*thread_return);8.2 线程线程实验:简单的线程程序#include void*thread_function(void*arg);char message=“Hello World”;int main()int res;pthread_t a_thread;void*thread_result;res=pthread_create(&a_thread,NULL,thread_function,(void*)message);if(res!=0)perr

5、or(“Thread creation failed”);exit(EXIT_FAILURE);printf(“Waiting for thread to finishn”);res=pthread_join(a_thread,&thread_result);if(res!=0)perror(“Thread join filed”);exit(EXIT_FAILURE);printf(“Thread joined,it returned%sn”,(char*)thread_result);printf(“Message is now%sn”,message);exit(EXIT_SUCCESS

6、);void*thread_function(void*arg)printf(“thread_function is running.Argument was%sn”,(char*)arg);sleep(3);strcpy(message,“Bye!”);pthread_exit(“Thank you for the CPU time”);8.2 线程线程练习:编写一个程序,至少创建2个线程,两个线程都循环执行,一个线程每隔1秒输出我是线程1,另一个线程每隔1秒输出我是线程28.3 线程的同步机制线程的同步机制信号量与进程间通信机制类似,但仅用于线程间同步操作过程中互斥量信号量的另一种应用,线

7、程同步机制的一种,某个线程先取得资源后,后访问资源的线程会被阻塞8.3.1 线程信号量线程信号量信号量创建函数sem_init参数sem:初始化的信号量对象参数pshared:控制信号量的类型(0:线程之间共享.0:进程之间共享)参数value:指定信号量的初始值#include int sem_init(sem_t*sem,int pshared,unsigned int value);8.3.1 线程信号量线程信号量信号量控制函数sem_wait和sem_postsem_wait():从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。sem_post():给信号

8、量的值加上一个“1”参数sem:指向sem_init初始化的信号量的指针参数#include int sem_wait(sem_t*sem);从从信号量信号量的值减去一个“的值减去一个“1”int sem_post(sem_t*sem);8.3.1 线程信号量线程信号量信号量清理函数sem_destroy#include int sem_destroy(sem_t*sem);8.3.1 线程信号量线程信号量练习:线程信号量#include#include#include#include#include#include sem_t sem;void*thread_function(void*ar

9、g);void sendsem()sem_post(&sem);char message=Hello World;int main()int res;pthread_t a_thread;void*thread_result;sem_init(&sem,0,0);signal(SIGINT,sendsem);res=pthread_create(&a_thread,NULL,thread_function,(void*)message);if(res!=0)perror(Thread creation failed);exit(EXIT_FAILURE);printf(Waiting for

10、SEM from SIGNAL.n);res=pthread_join(a_thread,&thread_result);if(res!=0)perror(“Thread join failed”);exit(EXIT_FAILURE);printf(“Thread joinedn”);exit(EXIT_FAILURE);void*thread_function(void*arg)sem_wait(&sem);printf(“thread_function is running.Argument was%sn”,(char*)arg);sleep(1);pthread_exit(NULL);

11、8.3.3 线程控制线程控制线程初始化属性函数pthread_attr_init#include int pthread_attr_init(pthread_attr_t*attr);8.3.3 线程控制线程控制线程属性修改函数,设置线程为独立线程attr参数:输出线程属性,在pthread_create被调用detachstate参数:PTHREAD_CREATE_DETACHED,使线程成为独立线程,不需要主线程调用pthread_join进行子线程的资源回收。#include int pthread_attr_setdetachstate(pthread_attr_t*attr,int

12、detachstate);8.3.3 线程控制线程控制练习:设置脱离状态属性#include#include#include#include void*thread_function(void*arg);char message=“Hello World”;int thread_finished=0;int main()int res;pthread_t a_thread;pthread_attr_t thread_attr;res=pthread_attr_init(&thread_attr);if(res!=0)perror(“Attribute creation failed”);exi

13、t(EXIT_FAILURE);res=pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);if(res!=0)perror(“Setting detached attribute failed”);exit(EXIT_FAILURE);res=pthread_create(&a_thread,&thread_attr,thread_function,(void*)message);if(res!=0)perror(“Thread creation failed”);exit(EXIT_FAILURE);pthre

14、ad_attr_destroy(&thread_attr);while(!thread_finished)printf(“Waiting for thread to say its finishedn”);sleep(1);printf(“Other thread finished,bye!n”);exit(EXIT_SUCCESS);void*thread_function(void*arg)printf(“thread_function is running.Argument was%sn”,(char*)arg);sleep(4);printf(“Second thread setting finished flag,and exiting nown”);thread_finished=1;pthread_exit(NULL);Copyright 2008 版权所有 东软集团

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁