Два набора фигурных скобок с использованием лямбда-функций? - PullRequest
0 голосов
/ 19 февраля 2020

Мне интересно, может ли кто-нибудь помочь мне понять следующий синтаксический фрагмент, в частности разделы 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;
    });
}

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Они часть лямбды, да. Но все, что они делают, это создают свои собственные возможности. Это, в конце концов, цель фигурных скобок в C ++. В частности, фигурные скобки позволяют создавать составные операторы, и этот составной оператор будет иметь собственную локальную область действия.

0 голосов
/ 19 февраля 2020

Дополнительные фигурные скобки просто используются для создания дополнительных блоков областей действия , чтобы ограничить время жизни std::unique_lock объектов. Объекты разрушаются, освобождая свои блокировки, когда они go выходят за рамки.

[&](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 операторов, циклов и т. Д. c. Для создания новых областей можно использовать фигурные скобки, а области можно вкладывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...