提问者:小点点

lock_guard在if-initializer中初始化,而不是在简单作用域中初始化


这是正确的吗

if (std::lock_guard lk(m_state.mtx); true) {
  m_state.aborting = true;
}

{
  std::lock_guard lk(m_state.mtx)
  m_state.aborting = true;
}

百分百一致吗?

下面是关于我的问题的背景:在掌握C++17 STL中,作者给出了一个线程池的代码示例。它包含以下内容(第208页):

~ThreadPool() {
  if (std::lock_guard lk(m_state.mtx); true) {  // <<--- Line of interest
    m_state.aborting = true;
  }

  m_cv.notify_all();
  for (std::thread& t : m_workers) { 
    t.join();
  }
}

标记行使用if-statement的初始化器部分创建lock_guard。在其他问题中也使用了这一点,以便将lock_guard的范围限制在if-statement上,同时保护if-statement本身的求值。

在这个例子中让我困惑的是,if语句没有适当的条件。根据if上的cppreference页面,

如果使用init-statement,则If语句等效于

{
  init_statement
  if ( condition )
    statement-true
}

在本例中,这意味着等效于

{
  std::lock_guard lk(m_state.mtx);
  if (true) {
    m_state.aborting = true;
  }
}

我是不是错过了一个不是100%相同的情况,还是错过了一个用if-statement编写它的好理由?

在下一页的另一个例子中使用了相同的模式,因此我认为这是故意的,而不是实际情况下的遗留问题。


共1个答案

匿名用户

它们在语义上是相同的。因为这本书似乎都是关于新的C++17特性的,所以作者使用它是有意义的。但是要小心:每一个新特性都会被滥用,直到尘埃落定,并且在使用该特性的好的和不好的方式上达成共识为止。

以我的浅见,这种方式只会增加混乱(如果块是无条件执行的,为什么会有if构造?)我更喜欢简单的街区。时间会告诉我们,作者的方式是可以接受的,还是不被接受的。或者没有人关心,或者它将永远存在争议。