如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第八章:线程目标:本章旨在向学员介绍linux操作时间:3.5学时系统下线程的使用:1)了解linux系统下线程与进程教学方法:讲授PPT、实例练习的区别2)掌握线程相关的编程方法3)掌握线程间通信同步的机制8.1什么是线程?一个程序中的多个执行路线就叫线程(thread)定义定义线程是一个进程内部的控制序列,进程至少有一个执行线程调用fork创建的进程拥有自己的变量和PID,时间调度也独立,进程中创建线程时,新的线程拥有自不同不同己的栈,与它的创建者共享全局变量、文件描述符、信号句柄等资源线程执行开销小,但不利于资源的管理和保护,适合于在SMP机器上运行特点特点8.2线程•pthread_create()函数创建一个新线程,类似于创建新进程的fork函数#include<pthread.h>intpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)(void*),void*arg);参数thread:线程创建时,这个指针指向变量中被写入一个标识符,标识符来引用新线程参数attr:用于设置线程的属性参数start_routine:指定线程将要执行的函数参数arg:要执行函数传递的参数8.2线程•线程终止函数pthread_exit#include<pthread.h>voidpthread_exit(void*retval);8.2线程•收集线程函数pthread_join作用等价于进程中用来收集子进程信息的wait函数。#include<pthread.h>intpthread_join(pthread_tth,void**thread_return);参数th:指定将要等待的线程参数thread_return:指向线程的返回值8.2线程实验:简单的线程程序#include<pthread.h>perror(“Threadjoinfiled”);void*thread_function(void*arg);exit(EXIT_FAILURE);charmessage[]=“HelloWorld”;}intmain(){printf(“Threadjoined,itreturned%s\n”,(charintres;*)thread_result);pthread_ta_thread;printf(“Messageisnow%s\n”,message);void*thread_result;exit(EXIT_SUCCESS);res=pthread_create(&a_thread,NULL,}thread_function,(void*)message);void*thread_function(void*arg){if(res!=0){printf(“thread_functionisrunning.Argumentperror(“Threadcreationfailed”);was%s\n”,(char*)arg);exit(EXIT_FAILURE);sleep(3);}strcpy(message,“Bye!”);printf(“Waitingforthreadtofinish…\n”);pthread_exit(“ThankyoufortheCPUtime”);res=pthread_join(a_thread,&thread_result);}if(res!=0){8.2线程•练习:编写一个程序,至少创建2个线程,两个线程都循环执行,一个线程每隔1秒输出我是线程1,另一个线程每个1秒输出我是线程28.3线程的同步机制•信号量与进程间通信机制类似,但仅用于线程间同步操作过程中•互斥量信号量的另一种应用,线程同步机制的一种,某个线程先取得资源后,后访问资源的线程会被阻塞8.3.1线程信号量•信号量创建函数sem_init#include<semaphore.h>intsem_init(sem_t*sem,intpshared,unsignedintvalue);参数sem:初始化的信号量对象参数pshared:控制信号量的类型8.3.1线程信号量•信号量控制函数sem_wait和sem_post#include<semaphore.h>intsem_wait(sem_t*sem);intsem_post(sem_t*sem);参数sem:指向sem_init初始化的信号量的指针参数8.3.1