win 32多线程程序设计读书笔记

来源:互联网 发布:数据采集系统电路图 编辑:程序博客网 时间:2024/05/16 06:59
一直不是很熟悉windows下的编程,借着学习侯捷老师翻译的《win32 多线程程序设计》来完成操作系统的作业。


1.今天学到的比较重要的概念是核心对象(一下大部分话出自该书):

核心对象可以有多个拥有者,拥有者还可以是不同的进程,核心对象保持一个引用计数,记录有多少handles 对应到此对象,记录那个线程或进程是拥有者。当调用CreateHandle 之类会返回handle 的函数 ,引用计数+1,调用 CloseHandle 函数时,引用计数-1,一旦引用计数=0 ,对象被自动摧毁


Win32 核心对象:
进程,线程,文件,事件,信号量,互斥器,管道。


2.还学到了几个函数:

1. BOOL CloseHandle(HANDLE hObject )----用来释放核心对象

hObject -----代表一个已经打开的核心对象handle,比如说线程核心对象(现在只学了线程!!),如果成功 ,返回TRUE,否则返回FALSE.



2. BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);

hThread------由CreateHandle 传回的handle
lpExitCode-------指向一个DWORD, 用以接受结束代码



作用:通过检查结束代码来判断一个线程是否已经结束,如果没有结束 lpExitCode的值时STILL_ACTIVE


实例代码:

#include <windows.h>#include <stdio.h>#include <iostream>DWORD WINAPI ThreadFunc(LPVOID);int main(){HANDLE hThread1;HANDLE  hThread2;DWORD threadID;DWORD ExitCode1;DWORD ExitCode2;hThread1 = CreateThread(NULL,0,ThreadFunc,(LPVOID)1,0,&threadID);if (hThread1)printf("thread 1 is running!\n");hThread2 = CreateThread(NULL,0,ThreadFunc,(LPVOID)2,0,&threadID);if (hThread2)printf("thread 2 is running!\n");for (;;){printf("press any key to exit..\n");getchar();GetExitCodeThread(hThread1, &ExitCode1);GetExitCodeThread(hThread2, &ExitCode2);//std::cout << GetExitCodeThread(hThread1, &ExitCode1)<<std::endl;if (ExitCode1 == STILL_ACTIVE){printf("thread 1 is still running !\n");}if ( ExitCode2 == STILL_ACTIVE){printf("thread 2 is still running!\n");}if (ExitCode1 != STILL_ACTIVE&& ExitCode2 != STILL_ACTIVE){break;}}CloseHandle(hThread1);CloseHandle(hThread2);std::cout << "Thread 1 return " << ExitCode1 <<std::endl;std::cout << "Thread 2 return " << ExitCode2 << std::endl;//Sleep(2000);return EXIT_SUCCESS;}DWORD WINAPI ThreadFunc(LPVOID p){//printf("%d%d%d%d%d%d%d!\n",p,p,p,p,p,p,p);Sleep((DWORD)p * 10000);return 0;}
0 0
原创粉丝点击