多线程同步,关于Semaphore问题

huangweibuct 2009-08-31 10:13:03
加精
我想让主线程发一个信号唤醒制定的一个线程,然后再由唤醒后的这个线程在发送另外一个信号唤醒另一个线程。

主线程:
A
{
...

h1 = CreateSemaphore( NULL, cMax,cMax, NULL); // unnamed semaphore

printf("signal");
if (hSemaphore == NULL)

{

printf("CreateSemaphore 1 error: %d\n", GetLastError());

}

if (!ReleaseSemaphore(h1,1, NULL) )
{
printf("Release h1 error: %d\n", GetLastError());
}
Sleep(3000);
CloseHandle(h1);
..
}

需要唤醒的第一个线程
B
{
...

DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(h1,0L);

switch (dwWaitResult)
{
case WAIT_OBJECT_0:
{
...
h2 = CreateSemaphore(NULL,cMax,cMax,NULL);
if (h2 == NULL)

{

printf("CreateSemaphore 2 error: %d\n", GetLastError());

}
if (!ReleaseSemaphore(h2,1, NULL) )
{
printf("Release h2 error: %d\n", GetLastError());
}
Sleep(3000);
CloseHandle(h2);
}


...
}

B要唤醒的线程
C
{
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(hRecvSemaphore,0L);

switch (dwWaitResult)
{

case WAIT_OBJECT_0:
{
...

}

break;
}
...


可是为什么Release h2 error?
...全文
886 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
HuWenjin 2009-09-03
  • 打赏
  • 举报
回复
参考这里
http://www.ibm.com/developerworks/cn/linux/l-ipc2lin2.html

你会得到更多解决办法与示例代码
gongguangfu 2009-09-02
  • 打赏
  • 举报
回复
祝各位好运呀。
dt2816 2009-09-02
  • 打赏
  • 举报
回复
呵呵……
ybsenyer 2009-09-02
  • 打赏
  • 举报
回复
学习学习
fldx 2009-09-01
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
chen13668496434 2009-09-01
  • 打赏
  • 举报
回复
没有发送信号吧,那线程没有信号,你怎么释放掉啊,释放应该也是在该线程内部啊。
鲜为人知 2009-09-01
  • 打赏
  • 举报
回复
关注一下,线程问题应该不是很复杂
yangyang__ 2009-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wubaobao 的回复:]
h2 = CreateSemaphore(NULL,cMax,cMax,NULL);
因为创建信号量时,信号量的计数已经是最大值了,
ReleaseSemaphore(h2,1, NULL)
会增加信号的计数值,所有会不成功
[/Quote]

1楼的是正确的.CreateSemaphore函数的第二个参数可以理解为创建信号量时可用的资源数量.ReleaseSemaphore函数的调用会增大可用的资源数量.

3楼:
MSDN上的CreateSemaphore例子,初始化ghSemaphore = CreateSemaphore(
NULL, // default security attributes
MAX_SEM_COUNT, // initial count
MAX_SEM_COUNT, // maximum count
NULL); // unnamed semaphore
都为最大,然后就wait,线程函数里才有Release


没看太懂。。
-------------
我把信号量理解成有两种用法.第一种是在创建时初始化资源数为0.这样在Wait的时候,必须等待别的线程Release.第二种是在创建时初始化资源数为最大.这样当资源的使用量没有超过最大时,所有wait都会立即返回执行下面的任务;而一旦资源的使用量超过最大时,再wait就会挂起了,直到有别的线程Release.我感觉这两种用法各有作用.

这是我的理解,供大家参考和指正.
黑夜de星辰 2009-09-01
  • 打赏
  • 举报
回复
学习
bob0411 2009-09-01
  • 打赏
  • 举报
回复
继续几分的说
hjd3760840 2009-09-01
  • 打赏
  • 举报
回复
看不懂 呵呵
kevindeng1986 2009-09-01
  • 打赏
  • 举报
回复
Thanks for sharing!
kecoi 2009-09-01
  • 打赏
  • 举报
回复
这里用事件应该会更好。PS:一楼的说法我看不懂,每次调用CreateSemaphore函数的时候都是重新开辟资源吧,不过试一试就知道了,楼主可以在h2 = CreateSemaphore(NULL,cMax,cMax,NULL); 这句话设一个断点查看下。
laiyune1985 2009-09-01
  • 打赏
  • 举报
回复
看高手们讨论是个很好的学习方法。
ygyi2008 2009-08-31
  • 打赏
  • 举报
回复
学习
zww219 2009-08-31
  • 打赏
  • 举报
回复
你荣幸的被我灌水。~~谢谢
huangweibuct 2009-08-31
  • 打赏
  • 举报
回复
MSDN上的CreateSemaphore例子,初始化ghSemaphore = CreateSemaphore(
NULL, // default security attributes
MAX_SEM_COUNT, // initial count
MAX_SEM_COUNT, // maximum count
NULL); // unnamed semaphore
都为最大,然后就wait,线程函数里才有Release


没看太懂。。
huangweibuct 2009-08-31
  • 打赏
  • 举报
回复
在创建的时候是没有发信号的吧,release才是发信号吧?
wubaobao 2009-08-31
  • 打赏
  • 举报
回复
h2 = CreateSemaphore(NULL,cMax,cMax,NULL);
因为创建信号量时,信号量的计数已经是最大值了,
ReleaseSemaphore(h2,1, NULL)
会增加信号的计数值,所有会不成功
lwj006 2009-08-31
  • 打赏
  • 举报
回复
不懂。
加载更多回复(16)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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