计算机操作系统操作系统 (13).pdf
第四章 线程(三)线程库内容线程库Pthread线程库JAVA线程库Win32线程库2线程库为程序员提供API来创建和管理线程两种模式:用户库(用户线程)存在于用户空间没有内核支持调用线程库不会产生系统调用内核库(内核线程)存在于内核操作系统支持调用线程库会产生系统调用3Pthreads线程库Pthreads:POSIX线程线程(POSIX threads)线程的POSIX标准标准定义了创建和操纵线程的一整套API用在类用在类Unix操作系统操作系统(Unix、Linux、Mac OS X等)Windows也有移植版pthreads-win32一般多为用户线程POSIX标准:可移植操作系统接口(Portable Operating System Interface)定义了操作系统为应用程序提供的接口标准为各种UNIX软件定义的一系列API标准总称常用线程操作pthread_create():创建一个线程pthread_exit():终止当前线程pthread_cancel():中断另外一个线程的运行pthread_join():阻塞当前的线程,直到另外一个线程运行结束pthread_attr_init():初始化线程的属性pthread_t:线程IDpthread_attr_t:线程属性5Pthread例子#include#include#include#include#includepthread_t ntid;void*thr_fn(void*arg)printids(new thread:);return(void*)0);int main()int err;err=pthread_create(&ntid,NULL,thr_fn,NULL);if(err!=0)printf(cant create thread:%sn,strerror(err);return 1;sleep(1);return 0;gcc-o mypthread-lpthread mypthread.cJava 线程库Java 线程由JAVA虚拟机JVM管理JAVA线程操作系统不可见用户线程定义了创建和操纵线程的一整套API跨操作系统平台Java 线程创建扩展java.lang.Thread类(书本例子)实现Runnable接口Java线程例子public class DoSomething implements Runnable private String name;public DoSomething(String name)this.name=name;public void run()System.out.println(name+:+i);Runnable接口Run方法Java线程例子public class TestRunnable public static void main(String args)DoSomething ds1=new DoSomething(“1);DoSomething ds2=new DoSomething(“2);Thread t1=new Thread(ds1);Thread t2=new Thread(ds2);t1.start();t2.start();Java线程状态Java线程状态11Win32线程库Win32线程库是内核库内核线程线程创建方法Win 32 APIMFC.Net Framework12Win32线程库线程创建HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);线程函数原型:DWORD WINAPI threadfunc(LPVOID param);线程挂起DWORD SuspendThread(HANDLE hThread);线程恢复DWORD ResumeThread(HANDLE hThread);线程退出VOID ExitThread(DWORD dwExitCode);BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);13Win32 线程例子#include stdafx.h#include#include DWORD WINAPI Func(LPVOID param)while(true)Sleep(1000);coutinput;if(input=1)ResumeThread(hand1);else if(input=2)SuspendThread(hand1);else TerminateThread(hand1,1);return 0;return 0;14Windows 线程状态15资源可用解阻塞且资源可用解阻塞但资源不可用阻塞终止终止转换选择运行被抢占TransitionWaitingTerminatedNot RunnableRunnableReadyStandbyRunning