线程同步的三种方法(互斥,事件,临界区) 之二 使用互斥对象
2007-12-12 10:16
447 查看
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
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,TRUE,LPCWSTR("tickets"));
//创建时主线程拥有该互斥对象,互斥对象的线程ID为主线程的ID,同时将该互斥对象内部计数器置为1
if (hMutex)
{
if (ERROR_ALREADY_EXISTS==GetLastError())
{
cout<<"only one instance can run!"<<endl;
//Sleep(40000);
return;
}
}
//**************************************************************
WaitForSingleObject(hMutex,INFINITE);
//使用该函数请求互斥对象时,虽说该对象处于无信号状态,但因为请求的线程ID和该互斥对象所有者的线程ID是相同的.
//所以仍然可以请求到这个互斥对象,于是该互斥对象内部计数器加1,内部计数器的值为2.
ReleaseMutex(hMutex);//释放一次互斥对象,该互斥对象内部计数器的值递减1,操作系统不会将这个互斥对象变为已通知状态.
ReleaseMutex(hMutex);//释放一次互斥对象,该互斥对象内部计数器的值为0,同时将该对象设置为已通知状态.
//对于互斥对象来说,谁拥有谁释放
Sleep(40000);
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号
if (tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket :"<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);//设置该互斥对象的线程ID为0,并且将该对象设置为有信号状态
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex,INFINITE);
if (tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket :"<<tickets--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
相关文章推荐
- 线程同步的三种方法(互斥,事件,临界区) 之一 使用临界区对象
- 线程同步的三种方法(互斥,事件,临界区) 之三 使用事件对象
- VC下线程同步的三种方法(互斥、事件、临界区)/(转)
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区) - pl2597758的专栏 - CSDNBlog
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)
- VC下线程同步的三种方法(互斥、事件、临界区)
- 线程的创建、管理 与 使用信号灯、互斥量、临界区、事件进行线程同步或互斥
- 线程同步方法 - 互斥锁的使用实例
- 解析jQuery的三种bind/One/Live事件绑定使用方法
- jQuery的三种bind/One/Live事件绑定使用方法
- jQuery的三种bind/One/Live事件绑定使用方法
- 多线程同步方法:临界区、事件、信号量、互斥对象
- jQuery的三种bind/One/Live/On事件绑定使用方法
- jQuery的三种bind/One/Live/On事件绑定使用方法
- 线程同步的3种实现方法 互斥对象 临界资源 事件对象