将在“后”之后添加语句;return";要执行什么关键字? 我是C++初学者,想知道这个场景的影响: PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) { WaitForSingleObject(m_hSync); // m_hSync is HANDLE to mutex created using CreateMutex() return m_pcsbi; // m_pcsbi is of type PCONSOLE_SCREEN_BUFFER_INFOEX ReleaseMutex(m_hSync); // <== will this line be executed? } PCONSOLE\u SCREEN\u BUFFER\u INFOEX GetConsoleInfo(无效){ WaitForSingleObject(m_hSync);//m_hSync是使用CreateMutex()创建的互斥体的句柄 return m_pcsbi;//m_pcsbi的类型为PCONSOLE\u SCREEN\u BUFFER\u INFOEX ReleaseMutex(m_hSync);//
否,在返回语句之后,将调用作用域对象的析构函数,程序将退出该函数将在“后”之后添加语句;return";要执行什么关键字? 我是C++初学者,想知道这个场景的影响: PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) { WaitForSingleObject(m_hSync); // m_hSync is HANDLE to mutex created using CreateMutex() return m_pcsbi; // m_pcsbi is of type PCONSOLE_SCREEN_BUFFER_INFOEX ReleaseMutex(m_hSync); // <== will this line be executed? } PCONSOLE\u SCREEN\u BUFFER\u INFOEX GetConsoleInfo(无效){ WaitForSingleObject(m_hSync);//m_hSync是使用CreateMutex()创建的互斥体的句柄 return m_pcsbi;//m_pcsbi的类型为PCONSOLE\u SCREEN\u BUFFER\u INFOEX ReleaseMutex(m_hSync);//,c++,visual-c++,return,C++,Visual C++,Return,否,在返回语句之后,将调用作用域对象的析构函数,程序将退出该函数 int main() { //Step 1 GetConsoleInfo(); //2 return (0); //6 } PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) { //3 WaitForSingleObject(m_hSync); //4 return m_pcsbi; //5 ReleaseMutex(m_hSync);
int main() { //Step 1
GetConsoleInfo(); //2
return (0); //6
}
PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) { //3
WaitForSingleObject(m_hSync); //4
return m_pcsbi; //5
ReleaseMutex(m_hSync);
}
也许你应该这样做:
int main() {
WaitForSingleObject(m_hSync);
GetConsoleInfo();
ReleaseMutex(m_hSync);
return (0);
}
PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) {
return m_pcsbi;
}
在该特定场景中,没有。您需要在离开函数之前释放互斥体。在您的情况下,无法获取该代码。如果您有一个有条件的
返回(例如If(ptr==nullptr)return;
)当然也有跳过返回的条件,但无条件返回将是最后执行的语句
但是,样式清理会在返回后进行
否,但您可以有例外
if语句的示例:
PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) {
WaitForSingleObject(m_hSync); // m_hSync is HANDLE to mutex created using CreateMutex()
//if(statement)
return m_pcsbi; // m_pcsbi is of type PCONSOLE_SCREEN_BUFFER_INFOEX
//else
ReleaseMutex(m_hSync); // if the statement is false, it will skip return and execute this line
}
这正是需要的地方,通过以下方式实现:
PCONSOLE\u SCREEN\u BUFFER\u INFOEX GetConsoleInfo()
{
静态std::互斥m_hSync;
std::unique_lock lock{m_hSync};
return m_pcsbi;//m_pcsbi的类型为PCONSOLE\u SCREEN\u BUFFER\u INFOEX
//互斥在这里被隐式释放
}
释放互斥锁应该在作用域结束时自动完成,包括抛出异常的情况(在。此时只能调用析构函数,并且std::unique_lock
的析构函数会准确地释放互斥锁。为什么不使用测试程序确定自己的身份?如果(0){..}
执行中的语句吗?以同样的方式控制程序流。(MSVC++是否也警告过这一点?)无论你使用什么编译器,都应该有一个方法来激活警告;在这些警告中,应该有一个告诉你这个代码永远不会被执行。在现代C++中,我们有一个<代码> <代码>标题。它有一个漂亮的代码<代码:ST:::(包括函数作用域)什么都没有?析构函数在返回后执行。这为语言增添了美。非常感谢。您的回答帮助我理解这是如何执行的。(尝试勾选此答案,但在接下来的几分钟内不允许…)因此,为了释放互斥体,我必须这样做:WaitForSingleObject(m_hSync);PCONSOLE_SCREEN_BUFFER_INFOEX p=m_pcsbi;ReleaseMutex(m_hSync);返回p;我想在我的函数中调用Wait…()函数,因为调用我函数的人(GetConsoleInfo())可能不知道其他线程可能正在更改控制台信息…@tongko:不幸的是,这还不够。只有共享资源的两个用户也使用相同的互斥体时,互斥体才能保护共享资源。如果另一方不知道您的代码在控制台信息上工作,它就不会知道您的控制台信息互斥体对于C++初学者来说,术语“RAIIAL风格清理”可能有点不清楚,你不这么认为吗?):SpOK是真的,但同时,它至少是可以搜索的。
PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo()
{
static std::mutex m_hSync;
std::unique_lock<std::mutex> lock{m_hSync};
return m_pcsbi; // m_pcsbi is of type PCONSOLE_SCREEN_BUFFER_INFOEX
// mutex is released implicitly here
}