《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 版权所有 东软集团