gpt4 book ai didi

c++ - 多线程应用程序中的关键部分和 if,else 条件

转载 作者:太空宇宙 更新时间:2023-11-04 15:42:14 25 4
gpt4 key购买 nike

我可以将关键部分放在许多 if ,else 条件中吗,如下所示?

例子一

 somefunction()
{
EnterCriticalSection(&(g_variable));

if (...)
{
if (...)
{
...

}
else
{
...
if (...)
{...}
else if (...)
{...}

LeaveCriticalSection(&(g_variable));

}
}
else
{
...
}


}

或者像这样嵌套它们:

示例 2

EnterCriticalSection(&g_List); 
EnterCriticalSection(&g_Variable);
...
LeaveCriticalSection(&g_List);
LeaveCriticalSection(&g_Variable);

在此先感谢您的帮助。

最佳答案

可以做的和您应该做的是有区别的。

可以做您在问题中显示的内容。至少在我看来,您应该做的(因为您使用的是 C++)是使用 RAII 包装器来自动让您的 LeaveCriticalSection 调用与您的 EnterCriticalSection 调用相匹配。

class crit_sect {
CRITICAL_SECTION cs;

void lock() { EnterCriticalSection(&cs); }
void unlock() { LeaveCriticalSection(&cs); }
friend class lock;

crit_sect(crit_sect const &); /* = delete; */
crit_sect &operator=(crit_sect const &other); /* = delete; */
public:
crit_sect() { InitializeCriticalSection(&cs); }
~crit_sect() { DeleteCriticalSection(&cs); }
};

class lock {
crit_sect &cs;
public:
lock(crit_sect &c) : cs(c) { cs.lock(); }
~lock() { cs.unlock(); }
};

使用这些,你会得到类似的东西:

if (whatever) {
lock list_lock(g_List);
lock var_lock(g_Variable);

// ...

}

...当执行离开定义两个锁的范围时,析构函数将执行,自动解锁临界区。这很方便。如果您使用异常,它就变得更加重要,因为这意味着如果您通过异常而不是通过正常执行退出作用域,关键部分仍将被解锁。

关于c++ - 多线程应用程序中的关键部分和 if,else 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21290819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com