两组使用lambda函数的大括号

Two sets of curly braces using lambda functions?

本文关键字:函数 lambda 两组      更新时间:2023-10-16

我想知道是否有人能帮助我理解以下语法片段,特别是第1节和第2节(重点是两组花括号(。它与λ函数有关吗?如果是,如何?

void Logger::LogContentionAndAllocations() {
// 1
LogDetail([&](AsyncDetail& detail) {
{
std::unique_lock<std::mutex> lock(tls_loggers_registerd_mutex_);
for (auto tls_logger : tls_loggers_registerd_) {
CollectTlsLoggerStats(tls_logger);
}
}
//2.
{
std::unique_lock<std::mutex> lock(tls_logger_orphans_mutex_);
for (auto& orphan : tls_logger_orphans_) {
CollectTlsLoggerStats(orphan.get());
}
}
detail("Log Contention Counters:");
detail(std::to_string(swap_request_slots_retry_count_) + " : swap_request_slots_retry_count");
detail(std::to_string(swap_request_slots_retry_retry_count_) + " : swap_request_slots_retry_retry_count");
detail(std::to_string(swap_request_slots_retry_reencounter_count_) + " : swap_request_slots_retry_reencounter_count");
detail(std::to_string(start_reading_entries_retry_count_) + " : start_reading_entries_retry_count");
detail(std::to_string(tls_total_log_cas_fail_count_) + " : tls_total_log_cas_fail_count");
detail(std::to_string(tls_total_swap_buffers_slot_retry_count_) + " : tls_total_swap_buffers_slot_retry_count");
swap_request_slots_retry_count_ = 0;
swap_request_slots_retry_retry_count_ = 0;
swap_request_slots_retry_reencounter_count_ = 0;
start_reading_entries_retry_count_ = 0;
tls_total_log_cas_fail_count_ = 0;
tls_total_swap_buffers_slot_retry_count_ = 0;
});
}
是的,它们是lambda的一部分。但他们所做的只是创建自己的范围。毕竟,这就是C++中大括号的用途。更具体地说,大括号允许您创建一个复合语句,该复合语句将具有自己的局部作用域。

额外的大括号只是用来创建额外的作用域块,以限制std::unique_lock对象的生存期。当对象超出范围时,它们将被销毁并释放锁。

[&](AsyncDetail& detail) {
{ // <-- new scope created here
std::unique_lock<std::mutex> lock(tls_loggers_registerd_mutex_);
for (auto tls_logger : tls_loggers_registerd_) {
CollectTlsLoggerStats(tls_logger);
}
} // <-- lock destroyed here
//2.
{ // <-- new scope created here
std::unique_lock<std::mutex> lock(tls_logger_orphans_mutex_);
for (auto& orphan : tls_logger_orphans_) {
CollectTlsLoggerStats(orphan.get());
}
} // <-- lock destroyed here
...
}

这与用于函数体、if语句、循环等的大括号没有什么不同。大括号可以用于创建新的作用域,并且作用域可以嵌套。