用互斥对象(Mutex)来完成两个子程序的互斥。

//Mutex.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include... // Mutex.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Mutex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
static int count=5;
static HANDLE h1;
static HANDLE h2;
LPCRITICAL_SECTION hCriticalSection;
CRITICAL_SECTION Critical;
void func1();
void func2();
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
DWORD dwThreadID1,dwThreadID2;
hCriticalSection=&Critical;
InitializeCriticalSection(hCriticalSection);
h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func1,
(LPVOID)NULL,
0,&dwThreadID1);
if(h1==NULL)
printf("Thread1 create Fail!\n");
else
printf("Thread1 create Success!\n");
h2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func2,
(LPVOID)NULL,
0,&dwThreadID2);
if(h1==NULL)
printf("Thread2 create Fail!\n");
else
printf("Thread2 create Success!\n");
Sleep(1000);
CloseHandle(h1);
CloseHandle(h2);
DeleteCriticalSection(hCriticalSection);
ExitThread(0);
return nRetCode;
}
void func2()
{
int r2;
EnterCriticalSection(hCriticalSection);
r2=count;
_sleep(100);
r2=r2+1;
count=r2;
printf("count in func2=%d\n",count);
LeaveCriticalSection(hCriticalSection);
}
void func1()
{
int r1;
EnterCriticalSection(hCriticalSection);
r1=count;
_sleep(500);
r1=r1+1;
count=r1;
printf("count in func1=%d\n",count);
LeaveCriticalSection(hCriticalSection);
}
这是用临界区对象做的,如何用互斥对象来完成? 刚开始学,怎么也搞不懂了,求帮助啊~~~
展开
 我来答
帐号已注销
2012-11-03 · TA获得超过3001个赞
知道大有可为答主
回答量:1338
采纳率:75%
帮助的人:1338万
展开全部
楼主,你的程序也太乱了吧。
Mutex的用法也很简单,在main函数里创建一个Mutex,在线程里进入一段代码前用WaitForSIngleObject,退出代码后用ReleaseMutex就行了。
下面是从static int count=5开始的程序,前面的不用改。
static int count=5;
static HANDLE h1;
static HANDLE h2;
HANDLE g_hMutex;
void func1();
void func2();
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
DWORD dwThreadID1,dwThreadID2;
g_hMutex = CreateMutex(NULL, FALSE, NULL);
h1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func1,
(LPVOID)NULL,
0,&dwThreadID1);
if(h1==NULL)
printf("Thread1 create Fail!\n");
else
printf("Thread1 create Success!\n");
h2=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0,
(LPTHREAD_START_ROUTINE)func2,
(LPVOID)NULL,
0,&dwThreadID2);
if(h1==NULL)
printf("Thread2 create Fail!\n");
else
printf("Thread2 create Success!\n");
Sleep(1000);
CloseHandle(h1);
CloseHandle(h2);
ExitThread(0);
return nRetCode;
}
void func2()
{
int r2;
WaitForSingleObject(g_hMutex, INFINITE);
r2=count;
_sleep(100);
r2=r2+1;
count=r2;
printf("count in func2=%d\n",count);
ReleaseMutex(g_hMutex);
}
void func1()
{
int r1;
WaitForSingleObject(g_hMutex, INFINITE);
r1=count;
_sleep(500);
r1=r1+1;
count=r1;
printf("count in func1=%d\n",count);
ReleaseMutex(g_hMutex);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式