65,211
社区成员
发帖
与我相关
我的任务
分享// 简述:
// 一个互斥体多线程的小例问题
// 透过两个线程,模拟火车站两个窗口,共卖一百张票连号的票
// 要求票号不能错,不能漏,不能重
// 调试环境:VC2008 Debug模式下
#include <Windows.h>
DWORD WINAPI Thread1Proc(LPVOID lpParameter);
DWORD WINAPI Thread2Proc(LPVOID lpParameter);
static int tickets = 100;
static HANDLE hMutex = NULL;
#define TICKET_SELL 1
int _tmain()
{
hMutex = ::CreateMutex(NULL, TRUE, L"tickets");
/*
问题一:
HANDLE WINAPI CreateMutex(
__in LPSECURITY_ATTRIBUTES lpMutexAttributes,
__in BOOL bInitialOwner,
__in LPCTSTR lpName
);
__in是个什么东东?
*/
HANDLE hThread1 = ::CreateThread(NULL, NULL, Thread1Proc, NULL, 0, NULL);
HANDLE hThread2 = ::CreateThread(NULL, NULL, Thread2Proc, NULL, 0, NULL);
::CloseHandle(hThread1);
::CloseHandle(hThread2);
if (hMutex)
{
// 检测tickets是否已有执行体存在
if (ERROR_ALREADY_EXISTS == ::GetLastError())
{
if (ERROR_ALREADY_EXISTS == ::GetLastError())
{
printf("only instance can run!\n");
}
/*
问题二:
DWORD WINAPI GetLastError(void);
它的返回值为什么在Autos观感窗里看不见?
而有的函数,明明是看得见的?
问题三:
GetLastError有MSDN解注
1)Retrieves the calling thread's last-error code value.
2)The last-error code is maintained on a per-thread basis.
3)Multiple threads do not overwrite each other's last-error code.
对于1,调用它,以获得最近的出错信息.
最近,究竟多近!!!是指上一句呢?还是上一可能有出错信息的那句?
还是最近已经出错信息的那句?
并且,它究竟何时被清掉呢?或重置?
对于2,是指每个线程有各自专属的的出错信息吗?
对于3,overwrite如何理解?
*/
printf("only instance can run!\n");
return -1;
}
}
else
{
return -2;
}
::ReleaseMutex(hMutex);
::Sleep(INFINITE);
return 0;
}
DWORD WINAPI Thread1Proc(LPVOID lpParameter)
{
#if TICKET_SELL
while (TRUE)
{
DWORD ret1 = ::WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
printf("Thread1 sell ticket : %d\n", tickets--);
}
else
{
break;
}
::ReleaseMutex(hMutex);
}
#else
DWORD ret1 = WaitForSingleObject(hMutex, INFINITE);
printf("thread1 is running\n");
#endif
return 0;
}
DWORD WINAPI Thread2Proc(LPVOID lpParameter)
{
#if TICKET_SELL
while (TRUE)
{
DWORD ret2 = ::WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
printf("Thread2 sell ticket : %d\n", tickets--);
}
else
{
break;
}
::ReleaseMutex(hMutex);
}
#else
DWORD ret2 = WaitForSingleObject(hMutex, INFINITE);
printf("thread2 is running\n");
#endif
return 0;
}
DWORD dwLastError = -1;
...
dwLastError = GetLastError(); //在这里,一般调试器都会显示变量dwLastError的值