我是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?
}
想知道[ReleaseMutex()]会被执行吗?
答案 0 :(得分:6)
在你的情况下,无法获得该代码。如果您有条件return
(例如if (ptr==nullptr) return;
),那么当然有条件会跳过返回。但无条件的回报将是最后执行的陈述。
但是,return
之后会发生RAII样式清理。
答案 1 :(得分:3)
在特定情况下没有。您需要在离开函数之前释放互斥锁。
答案 2 :(得分:2)
不,在返回语句之后,将调用范围对象的析构函数,程序将退出该函数。
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;
}
答案 3 :(得分:0)
不,但你可以有例外
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
}
答案 4 :(得分:0)
这正是需要RAII的地方,由std::unique_lock
实施:
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
}
释放互斥锁是应该在范围结束时自动完成的,包括抛出异常的情况(在stack unwinding期间)。此时只能调用析构函数,而std::unique_lock
的析构函数会准确释放互斥锁。