信号量Semaphore的问题

uda1985 2011-08-17 12:58:37
这个其实是MSDN里面的代码,刚开始接触这个Semaphore,还不太懂。



#define MAX_SEM_COUNT 10
#define THREADCOUNT 12

HANDLE ghSemaphore;
DWORD WINAPI ThreadProc( LPVOID );

int main(int argc, char* argv[])
{
HANDLE aThread[THREADCOUNT];
DWORD ThreadID;
int i;

ghSemaphore = CreateSemaphore(
NULL,
MAX_SEM_COUNT,
MAX_SEM_COUNT,
NULL);
if (ghSemaphore == NULL)
{
printf("CreateSemaphore error: %d\n", GetLastError());
return 0;
}
for( i=0; i < THREADCOUNT; i++ )
{
aThread[i] = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE) ThreadProc,
NULL,
0,
&ThreadID);

if( aThread[i] == NULL )
{
printf("CreateThread error: %d\n", GetLastError());
return 0;
}
}
Sleep(2000);
WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);
for( i=0; i < THREADCOUNT; i++ )
CloseHandle(aThread[i]);

CloseHandle(ghSemaphore);
return 0;
}
DWORD WINAPI ThreadProc( LPVOID lpParam )
{
DWORD dwWaitResult;
BOOL bContinue = true;

while(bContinue)
{
dwWaitResult = WaitForSingleObject(
ghSemaphore,
0L);

switch (dwWaitResult)
{
case WAIT_OBJECT_0:
{
bContinue = false ;
printf("Thread %d: wait succeeded\n", GetCurrentThreadId());
Sleep(500);
if (!ReleaseSemaphore(
ghSemaphore,
1,
NULL) )
{
printf("ReleaseSemaphore error: %d\n", GetLastError());
}
break;
}
case WAIT_TIMEOUT:
{
printf("Thread %d: wait timed out\n", GetCurrentThreadId());
break;
}
}
}
return TRUE;

}


结果:

Thread 1532: wait succeeded
Thread 5508: wait succeeded
Thread 220: wait succeeded
Thread 2644: wait succeeded
Thread 6008: wait succeeded
Thread 6008: wait succeeded
Thread 5980: wait succeeded
Thread 4492: wait succeeded
Thread 5084: wait succeeded
Thread 4860: wait succeeded
Thread 544: wait succeeded
Thread 3640: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait timed out
Thread 3640: wait timed out
Thread 3668: wait succeeded
Thread 3640: wait succeeded
Press any key to continue。。。

出现了2个6008线程,这个为什么呢?
第一次获取成功的时候bContinue = false了。
...全文
115 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
uda1985 2011-08-17
  • 打赏
  • 举报
回复
这个格式不会搞,见谅。
自己顶个先。
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
好像vc6的printf有bug。估计是bug导致显示了两次吧。
线程执行情况应该就是我说的那种。
uda1985 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luciferisnotsatan 的回复:]
windows上通用的吧。
即使是线程调度,最多也是起始10succeeded中间夹带了些timeout,实在想不出起始为何会超过10个succeeded,而且是一个线程,连续两次succeeded。

我的是 windows xp 32bit + vs2005的环境
[/Quote]
这次找了个相同的环境,VC6.0还是老问题,然后换了下VS2005,果然不会出现了。这个是不是编译器的问题哎。
uda1985 2011-08-17
  • 打赏
  • 举报
回复
这个跑了一下,开始是正常的,然后就和以前出现才情况一样了,有没有合理一点的解释呢?
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
windows上通用的吧。
即使是线程调度,最多也是起始10succeeded中间夹带了些timeout,实在想不出起始为何会超过10个succeeded,而且是一个线程,连续两次succeeded。

我的是 windows xp 32bit + vs2005的环境
uda1985 2011-08-17
  • 打赏
  • 举报
回复
lucifer谢谢你了,我下午换台机子再试试吧。
这个要跨机吗?
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 uda1985 的回复:]

引用 8 楼 luciferisnotsatan 的回复:
按理来说,信号量是10,12个线程,开始后10个线程拿到信号量,剩下2个不停time out。
整个过程大致上也是如此,就6008连着出了两次。。。。。。

是啊,While循环应该进步去的。但是,这里成功了。。。
[/Quote]
不光是while不进去。这里还有个sleep(500)。这样,即使进了while,中间也应该还有其他的succeeded和time out才对。
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
我电脑上执行了5次,没lz的问题。

Thread 1036: wait succeeded
Thread 164: wait succeeded
Thread 4172: wait succeeded
Thread 3784: wait succeeded
Thread 1544: wait succeeded
Thread 5612: wait succeeded
Thread 5456: wait succeeded
Thread 4368: wait succeeded
Thread 5808: wait succeeded
Thread 1224: wait succeeded
Thread 1812: wait timed out
Thread 6120: wait timed out
Thread 1812: wait timed out
Thread 6120: wait timed out
省去n行time out
Thread 6120: wait timed out
Thread 1812: wait timed out
Thread 6120: wait succeeded
Thread 1812: wait succeeded
uda1985 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 luciferisnotsatan 的回复:]
按理来说,信号量是10,12个线程,开始后10个线程拿到信号量,剩下2个不停time out。
整个过程大致上也是如此,就6008连着出了两次。。。。。。
[/Quote]
是啊,While循环应该进步去的。但是,这里成功了。。。
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
按理来说,信号量是10,12个线程,开始后10个线程拿到信号量,剩下2个不停time out。
整个过程大致上也是如此,就6008连着出了两次。。。。。。
uda1985 2011-08-17
  • 打赏
  • 举报
回复
Thread 5784: wait succeeded
Thread 1492: wait succeeded
Thread 1492: wait succeeded
Thread 2784: wait succeeded
Thread 3936: wait succeeded
Thread 5616: wait succeeded
Thread 4464: wait succeeded
Thread 5680: wait succeeded
Thread 5076: wait succeeded
Thread 5076: wait succeeded
Thread 2568: wait succeeded
Thread 4304: wait succeeded
Thread 5568: wait timed out
Thread 5568: wait timed out
Thread 5568: wait timed out
Thread 5568: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait timed out
Thread 4496: wait timed out
Thread 5568: wait timed out
Thread 4496: wait succeeded
Thread 5568: wait succeeded

这个1492和5076都成功了。去掉重复的总数是10个是么有问题的,但是为什么会有重复的呢?
uda1985 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jingavin0 的回复:]
这什么语言编的?c#的?
[/Quote]
C 语言。
uda1985 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luciferisnotsatan 的回复:]
windows 核心编程
[/Quote]
9.5 信标内核对象 210
这个下载了,介绍Semaphore的感觉不是很详细,我是菜鸟。
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
代码粗的过了遍,想不明白为什么连续两个6008
Thread 6008: wait succeeded
Thread 6008: wait succeeded
jingavin0 2011-08-17
  • 打赏
  • 举报
回复
这什么语言编的?c#的?
luciferisnotsatan 2011-08-17
  • 打赏
  • 举报
回复
windows 核心编程

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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