两组使用lambda函数的大括号
Two sets of curly braces using lambda functions?
我想知道是否有人能帮助我理解以下语法片段,特别是第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;
});
}
额外的大括号只是用来创建额外的作用域块,以限制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
语句、循环等的大括号没有什么不同。大括号可以用于创建新的作用域,并且作用域可以嵌套。
相关文章:
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在构造函数中使用 lambda 的 C++ 类
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++:Lambda 函数指针转换的用例是什么?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- std::映射服装比较函数和函数/lambda错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 排序测试模板化函数 lambda:非法使用此类型作为表达式
- 将匿名函数(lambda)保存为函数类型变量
- 如何编写将自身作为回调传递的匿名函数/lambda