【发布时间】:2012-09-08 23:09:15
【问题描述】:
如果我像这样定义模板结构:
template <typename T>
struct SYNCHED_DATA
{
SYNCHED_DATA()
{
hMutex = ::CreateMutex(NULL, FALSE, NULL);
}
~SYNCHED_DATA()
{
if(hMutex)
CloseHandle(hMutex);
hMutex = NULL;
}
void set(T* pV)
{
if(pV)
{
::WaitForSingleObject(hMutex, INFINITE);
var = *pV;
::ReleaseMutex(hMutex);
}
}
void get(T* pV)
{
if(pV)
{
::WaitForSingleObject(hMutex, INFINITE);
*pV = var;
::ReleaseMutex(hMutex);
}
}
private:
HANDLE hMutex;
T var;
SYNCHED_DATA(const SYNCHED_DATA& s)
{
}
SYNCHED_DATA& operator = (const SYNCHED_DATA& s)
{
}
};
我可以确定那些 WaitForSingleObject() API 将始终返回 WAIT_OBJECT_0 吗?如果不是,在什么情况下会失败,我应该如何处理?
【问题讨论】:
-
The documentation 详细介绍了返回码。
-
"WAIT_FAILED = 函数失败。要获取扩展错误信息,请调用 GetLastError。" ——你可以“详细”吗???
-
我的意思是它具有所有可能的返回值及其含义。如果您没有注意到,
GetLastError()使用的错误列表也是巨大的。 -
那又如何,我需要一个“巨大”的 switch 语句来处理它们?
-
如果您发现自己遇到了其中一个问题,通常最好显示/记录错误代码,并可选择使用
FormatMessage将其转换为描述错误的字符串。
标签: c++ winapi synchronization