一个互斥体多线程的小例问题

中才德创 2009-05-28 12:23:22
// 简述:
// 一个互斥体多线程的小例问题
// 透过两个线程,模拟火车站两个窗口,共卖一百张票连号的票
// 要求票号不能错,不能漏,不能重

// 调试环境: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;
}
...全文
114 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
中才德创 2009-05-30
  • 打赏
  • 举报
回复
up
rularys 2009-05-30
  • 打赏
  • 举报
回复

问题一:
__in是个什么东东?

一般是个宏,空的宏,没什么作用,出了用于增加代码的可读性;__int 表示这个参数是输入参数,还有__out,表示其后面紧跟着的参数用于函数输出(有些函数不仅有返回值,还要用参数来传递它的运算结果)。

问题二:
DWORD WINAPI GetLastError(void);
它的返回值为什么在Autos观感窗里看不见?
而有的函数,明明是看得见的?
这要看你的调试环境,环境不一样,效果就不一样。你试着可以这样:


DWORD dwLastError = -1;
...

dwLastError = GetLastError(); //在这里,一般调试器都会显示变量dwLastError的值




问题三:
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如何理解?
*/

对于1
最近,是指当前线程之中最后一次调用SetLastError(DWORD)函数所设置值就是最近的错误代码。每个线程都有它自己的错误代码,线程1设置的最后错误代码不会影响线程2以其其他线程的相关变量,就是说,SetLastError(DWORD)与GetLastError()是现成相关的。

对于2
是的。

对于3
overwrite 是指这样的情况:线程1刚刚设置了错误代码1,此时对于它来说,这个错误代码就是它的最后错误代码,这时候如果有另一个线程,比如线程2,紧跟着也调用SetLastError(DWORD)设置了一个错误代码2。那么这时候,线程1的LastError与线程2的LastError到底是哪一次设置的错误代码呢?想必已经可以想象的到。对于线程1,不管别的线程有什么动作,它的最后错误代码在它重新调用SetLastError(DWORD)之前永远是错误代码1,对于线程2也是如此。这种情况就是“Multiple threads do not overwrite each other's last-error code”。反之,假如线程1的错误代码因为线程2的设置而同时变成了错误代码2,那么它们之间的“last-error code”就是被彼此所复写,即 “overwrite ”。
zhaohongbo83 2009-05-30
  • 打赏
  • 举报
回复
怎么直接就return返回了。是不是写的有问题!
mengde007 2009-05-28
  • 打赏
  • 举报
回复
莫名奇妙;_in这个在MSDN里面根本不存在;
不符合条件,GetLastError根本就没机会去执行;
最近,究竟多近!!!是指上一句呢? 当然是刚刚出错的信息;不要说刚刚你不知道是什么时候;
中才德创 2009-05-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chinadragon_1981 的回复:]
__in因该是表示输入的,接着是数据类型

[/Quote]不错的思考.
ChinaRocLee 2009-05-28
  • 打赏
  • 举报
回复
__in因该是表示输入的,接着是数据类型

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧