线程同步问题1-互诉对象

#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int index=0;
int tickets=100; //全局变量,两个线程访问同一个对象。为了同步,应该创建互诉对象
HANDLE hMutex;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);//关闭句柄,不代表关闭线程.用此方法后,当线程运行完,系统将自动释放资源
CloseHandle(hThread2);

hMutex=CreateMutex(NULL,FALSE,NULL);
//创建线程互诉对象,FALSE初始为有信号状态.如果设为TRUE,表示主线程拥有了互诉对象,因为没有释放,所以线程1和2都将不会执行
// hMutex=CreateMutex(NULL,TRUE,NULL);//创建互斥对象,相当于一把钥匙去开房间
/*
hMutex=CreateMutex(NULL,TRUE,"tickets"); //创建一个有名字的互诉对象,
if(hMutex) //如果已经存在这个互诉对象,便返回。使系统中只存在一个程序实例
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only instance can run!"<<endl;
return;
}
}
*/
// WaitForSingleObject(hMutex,INFINITE);//请求互斥对象,计算器变为2
//ReleaseMutex(hMutex);//计数器减1
//ReleaseMutex(hMutex);//计数器再减1,变为0,其它线程可运行
Sleep(4000);//防止程序结束
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{


while(TRUE)
{

WaitForSingleObject(hMutex,INFINITE);//请求一个互诉对象,使线程2等待线程1执行完才能执行
if(tickets>0)
{
Sleep(1); //入进判断后,放弃执行,跳到线程2执行
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);//释放互诉对象的所有权
}
return 0;
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{

while(TRUE)
{

WaitForSingleObject(hMutex,INFINITE);//当线程1没有释放控制权时,线程2将请求不到互诉对象,不能继续执行
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
转载请说明出处,本文来自:【前线玩】http://www.qxwan.com/thread-144-1-3.html
如需了解更多,可访问 http://www.qxwan.com

posted on 2011-08-30 23:18  qxwan3  阅读(196)  评论(0)    收藏  举报