出于程序的需要,今天了解了一下线程使用方法,发现线程是个很好玩的东西,于是想写篇日志
编译:vc6.0
头文件:
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
最简单的用法:
DWORD WINAPI FunProc(LPVOID lpParameter);
void main()
{
cout<<"thread test;"<<endl;
HANDLE hThread = CreateThread(NULL,0,FunProc,NULL,0,NULL);
CloseHandle(hThread); //释放句柄资源,并非关闭进程
getchar(); //主线程一定要持续运行,否则子线程也会关闭
}
DWORD WINAPI FunProc(LPVOID lpParameter)//thread data
{
while (true)
{
cout<<"sub thread"<<endl;
Sleep(100);
}
return 0;
}
多线程、共享资源、资源加锁用法:
DWORD WINAPI user1(LPVOID lpParameter);
DWORD WINAPI user2(LPVOID lpParameter);
HANDLE hMutex; //独占资源“使用许可证”
void main()
{
cout<<"thread test..."<<endl;
int * resource = new int;
hMutex = CreateMutex(NULL, TRUE, "my resource"); //创建独占资源“使用许可证”
WaitForSingleObject(hMutex, INFINITE); //排队等待领取“使用许可证”,参数2表示等待时间(毫秒),INFINITE表示一直等到死!
*resource = 0;
cout << "you can use 'my resource' now!"<<endl;
ReleaseMutex(hMutex); //释放“使用许可证”
ReleaseMutex(hMutex); //释放“使用许可证”,为什么要重复释放两遍,舍不得?不解!
//开辟两个线程
HANDLE hThread1 = CreateThread(NULL, 0, user1, resource, 0, NULL);
HANDLE hThread2 = CreateThread(NULL, 0, user2, resource, 0, NULL);
Sleep(2000);
while(1)
{
WaitForSingleObject(hMutex, INFINITE);
cout<<"game over, you cannot use 'my resource' any more!"<<endl;
break;
}
//kill thread
cout << "now kill user1 and user2!"<<endl;
if(TerminateThread(hThread1, 0)){
cout<<"user1 was killed!"<<endl;
CloseHandle(hThread1);
}else {
cout<<"killing user1 failed!"<<endl;
}
if(TerminateThread(hThread2, 1)){
cout<<"user2 was killed!"<<endl;
CloseHandle(hThread2);
}else {
cout<<"killing user2 failed!"<<endl;
}
delete resource;
getchar();
}
DWORD WINAPI user1(LPVOID lpParameter)
{
while (true)
{
int resource = *(int *)lpParameter;
WaitForSingleObject(hMutex, INFINITE); //排队等待使用my resource
cout<<"user1:++resource; value = "<< ++resource <<endl;
Sleep(10);
ReleaseMutex(hMutex); //用完后释放my resource
}
return 0;
}
DWORD WINAPI user2(LPVOID lpParameter)
{
while (true)
{
int resource = *(int *)lpParameter;
WaitForSingleObject(hMutex, INFINITE);
cout<<"user2:--resource; value = "<< --resource <<endl;
Sleep(10);
ReleaseMutex(hMutex);
}
return 0;
}