VC中的同步机制,欢迎参与讨论------来者有分!
VC中的同步机制,欢迎参与讨论------来者有分!
楼主batizhou(batizhou)2002-05-14 15:02:06 在 VC/MFC / 基础类 提问 VC中有三种控制临界资源访问的方式:
1.CRITICAL_SECTION, 2.Mutex, 3.Semaphore;
但是前两者用于控制不同线程间的临界资源访问是有效的,对于同一线程则无效;
如在一个按钮的ON_CLICK函数下连写两个
EnterCriticalSection或WaitForSingleObject(hMutex)程序会继续运行,不会阻塞;
但Semaphore与前两者不同,如果连写两个WaitForSingleObject(hSemaphore),程序将会阻塞。
我的问题:
我先开一个线程,每0.1秒给主窗口发一个消息,主窗口有一个消息处理函数OnTestMsg
我用分别用以下三种方式测试能否控制对临界资源的访问
A. EnterCriticalSection(&sec);
AfxMessageBox("--------");
LeaveCriticalSection(&sec);
B. WaitForSingleObject(hMutex)
AfxMessageBox("--------");
ReleaseMutex(hMutex);
C. WaitForSingleObject(hSemaphore);
AfxMessageBox("--------");
ReleaseSemaphore(hSemaphore, 1, NULL);
CRITICAL_SECTION sec; HANDLE hMutex; HANDLE hSemaphore为全局变量,并正确初始化
我想达到以下效果,任意时刻只有一个AfxMessageBox("-------")对话框出来,关闭一个再弹出下一个,但只有C能达到此效果
A和B都会不断的弹出窗口。
我不明白主窗口的消息函数是以何种方式执行的,我觉得不应该是线程方式,否则A和B就能达到我想要的效果,但如果不是以线程方式执行,为何这个函数能同时被执行多次,否则不会弹出多个AfxMessageBox,不知各位大侠有何高见?
问题点数:100、回复次数:11Top
1 楼tianlinyi(笨蛋)回复于 2002-05-14 15:30:52 得分 10
:)Top
2 楼dyw(旺仔)回复于 2002-05-14 15:38:08 得分 10
upTop
3 楼lms()回复于 2002-05-14 15:58:48 得分 20
AfxMessageBox内部有Message Loop此时OnTestMsg会被继续调用,尽管此时是在AfxMessageBox function内部,请注意到这一点
Top
4 楼akademecia(你不说我倒还明白,你越说我越糊涂)回复于 2002-05-14 16:23:53 得分 20
msdn的sample里有同步的例子,好像使用的Semaphore,结果与C方法相同。
Top
5 楼batizhou(batizhou)回复于 2002-05-14 16:44:13 得分 0
我知道会被继续调用OnTestMsg,我想知道它是以什么方式被调用的,是线程?普通函数调用?还是其他的方式?Top
6 楼zyoujie()回复于 2002-05-14 16:45:25 得分 10
我试试Top
7 楼southnan(就这么着)回复于 2002-05-14 16:52:09 得分 10
关注,学习。
我现在做都是用事件,可能使我自己学得还比较浅。Top
8 楼ShallonXu(总参谋长)回复于 2002-05-14 16:54:54 得分 10
UPTop
9 楼batizhou(batizhou)回复于 2002-05-14 16:57:23 得分 0
其实在用C方法时,弹出一个AfxMessageBox对话框后程序好像就死了,点什么都没有,不过用此方法确实可以实现对临界资源的访问控制,A和B则不能。Top
10 楼liuweiwei1()回复于 2002-05-14 17:05:56 得分 5
i come,:)Top
11 楼qiuanhong(练从难处练,用从易处用)回复于 2002-05-14 17:26:32 得分 5
来啦
^_^Top
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的readygo.com.cn
