CreateSemaphore可以设置信号量初始值和最大值,ReleaseSemaphore函数的作用是增加信号量的计数,但没有减少信号量计数的值,初始值的设置又不能小于0,如何实现同步和互斥呢?习惯了unix下的信号量机制,现在遇到windows的实在转不过弯来
解决方案 »
- win32下多线程(进程)间如何进行消息通讯?(比如Linux下的消息队列)
- ViewForm中视图的切换应该怎么实现呢?
- 矢量图形编辑器的开发思路是什么。
- 高分求救,怎么在mainframe调用其它视图的onfileprint()函数????
- 因为这个问题已经郁闷了30分钟了,帮下忙看看,不胜感激.....
- 如何改变属性页中的标签的颜色,包括标签页旁边的那块空白处的颜色
- 用Shell_NotifyIcon函数的时候,NOTIFYICONDATA中的回调函数怎么响应?为什么我一挪到托盘区该图标就没了呢???
- 请问在VC下什么API函数可以把文件架设置为共享的方式?
- 如何换行,将数据库里的数据输出到窗口,。。。。
- 该死的对话框
- 这段代码看不懂g_hIcon = (HICON)LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_DISPLAYICON));真心谢你
- 还是那个问题- -
HANDLE hEvent;
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
SetEvent(hEvent);
线程一:
WaitForSingleObject(hEvent, INFINITE);
ResetEvent(hEvent);
....
SetEvent(hEvent);
线程二:
WaitForSingleObject(hEvent, INFINITE);
ResetEvent(hEvent);
....
SetEvent(hEvent);
但用信号量只有ReleaseSemaphore,岂不是类似于上面的只有ResetEvent而没有SetEvent,能举例说明吗?
首先,你的例子里面几个SetEvent和所有ResetEvent是多余的,用事件互斥是这样:
HANDLE hEvent;
hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
线程一:
WaitForSingleObject(hEvent, INFINITE);
....
SetEvent(hEvent);
线程二:
WaitForSingleObject(hEvent, INFINITE);
....
SetEvent(hEvent); 不知道这样写完之后,你能否将其和0,1信号量对应起来?
但还有一个问题,那互斥是不是应该是1,1信号量?WaitForSingleObject遇到初始值为0的信号量不阻塞吗?UNIX中的P操作-1<0是阻塞啊...
HANDLE hSemaphore;
hSemaphore = CreateSemaphore(NULL,-1,1,NULL);线程1:
ReleaseSemaphore();
......线程2:
ReleaseSemaphore();
......线程3:
WaitForSingleObject(hSemaphore, INFINITE);
......
但是发现信号量的初始值不能设为-1......
信号量的初始值不能小于0
你的这个情况没必要用信号量,可以用事件的方式,理解上更清晰,非要用也可以:
HANDLE hSemaphore;
hSemaphore = CreateSemaphore(NULL,0,2,NULL); 线程1:
ReleaseSemaphore();
...... 线程2:
ReleaseSemaphore();
...... 线程3:
WaitForSingleObject(hSemaphore, INFINITE);
WaitForSingleObject(hSemaphore, INFINITE);// two times
......建议你也可以参考下我的这个帖子:http://topic.csdn.net/u/20100308/16/7102875a-9103-494a-b1d0-253f1a1eba2e.html