您的位置:首页 > 其它

互斥对象 可以避免脏读

2015-06-25 09:53 357 查看
#include "stdafx.h"

#include <Windows.h>

#include <iostream>

#include <conio.h>

using namespace std;

DWORD WINAPI m_fun1(LPVOID lpParameter);

DWORD WINAPI m_fun2(LPVOID lpParameter);

int tickets=30;

HANDLE hMutex;

int _tmain(int argc, _TCHAR* argv[])

{

HANDLE hthread1;

HANDLE hthread2;

::hMutex=::CreateMutexA(NULL,FALSE,NULL);
//创建互斥对象

//如果参数为 TRUE 此互斥对象将被main线程所拥有

//创建线程

hthread1=::CreateThread(NULL,0,::m_fun1,NULL,0,NULL);

hthread2=::CreateThread(NULL,0,::m_fun2,NULL,0,NULL);

::CloseHandle(hthread1);

::CloseHandle(hthread2);

::Sleep(4000);

_getch();

return 0;

}

DWORD WINAPI m_fun1(LPVOID lpParameter)

{

while(1)

{

::WaitForSingleObject(::hMutex,INFINITE);
//请求互斥对象的所有权

//互斥对象可以被线程同时多次拥有 对应则需要多次释放

::Sleep(100);

if(tickets>0)

{

::Sleep(1);

cout<<"线程1出票"<<tickets--<<endl;

}

else

{

break;

}

::ReleaseMutex(::hMutex);
//释放互斥对象的所有权

//谁拥有了互斥对象 谁才有权释放

}

return 0;
//一旦线程结束,系统将自动释放其互斥对象的拥有权

}

DWORD WINAPI m_fun2(LPVOID lpParameter)

{

while(1)

{

::WaitForSingleObject(::hMutex,INFINITE);

::Sleep(50);

if(tickets>0)

{

::Sleep(1);

cout<<"线程2出票"<<tickets--<<endl;

}

else

{

break;

}

::ReleaseMutex(::hMutex);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: