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

标签 c++ multithreading critical-section

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

相关文章:

c++ - 在这种情况下有什么方法可以改进模板参数推导吗?

c++ - 简单多态转换不起作用

c++ - floor() 的奇怪行为

multithreading - 为什么我的多线程应用程序关闭时有时会挂起?

c++ - 如何使用 Boost 创建临界区?

c++ - 我需要在 Destructor 中删除 CriticalSection 吗?

c++ - 可以从静态函数调用构造函数吗?

c++ - tbb:task_scheduler_init 自定义分配器?

java - for-each 迭代线程安全吗?

multithreading - 使用列表时 Dart 隔离非常慢