我可以将关键部分放在许多 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/