首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >winapi类似于java的synchronized/wait()

winapi类似于java的synchronized/wait()
EN

Stack Overflow用户
提问于 2013-08-22 16:32:07
回答 1查看 251关注 0票数 1

java的同步块类似于windows临界区或互斥:一次只能有一个线程进入它。

但有一个区别:当您在synchronized块内调用wait()时,其他线程获得进入该块的能力。不确定如何在winapi中做同样的事情。

这不是一个解决方案:

代码语言:javascript
复制
LeaveCriticalSection();
// Something important may happen between these calls
WaitForSingleObject();

Java:

代码语言:javascript
复制
                    Thread 1            Thread 2            Thread 3
1
2                                       synchronized {
3                                       wait
5                   synchronized {
6                   notifyAll
7                   }
4                                       }
8                                                           synchronized {
9                                                           wait
10                                                          }
11                                      continue            not continue

雷米的变种:

代码语言:javascript
复制
                    Thread 1            Thread 2            Thread 3
1                                       EnterCriticalSection
2                                       ResetEvent
3                                       LeaveCriticalSection
4                   EnterCriticalSection
5                   SetEvent
6                   LeaveCriticalSection
7                                                           EnterCriticalSection
8                                                           ResetEvent
9                                                           LeaveCriticalSection
10                                      WaitForSingleObject WaitForSingleObject
11                                      not continue        not continue
EN

回答 1

Stack Overflow用户

发布于 2013-08-22 16:54:34

根据this tutorial的说法

同步的代码中调用wait会导致线程放弃其锁并进入睡眠状态。这通常会允许另一个线程获得锁并继续一些处理。

在Win32应用程序接口术语中,这相当于如下所示:

等待线程:

代码语言:javascript
复制
ResetEvent(hWaitEvent);
LeaveCriticalSection(&lock);
WaitForSingleObject(hWaitEvent, INFINITE);
EnterCriticalSection(&lock);

通知线程:

代码语言:javascript
复制
EnterCriticalSection(&lock);
...
SetEvent(hWaitEvent);
LeaveCriticalSection(&lock);

其中,hWaitEvent是使用CreateEvent()创建的可等待事件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18375316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档