Использование лямбды на месте для сложной инициализации, особенно const - PullRequest
3 голосов
/ 04 ноября 2019

Лямбды на месте можно использовать для комплексной инициализации. Таким образом, вы можете сделать что-то вроде этого:

const widget x = [&]{
    widget val;                                // assume that widget has a default constructor
    for (auto i = 2; i <= N; ++i) {            // this could be some
        val += some_obj.do_something_with(i);  // arbitrarily long code
    }                                          // needed to initialize x
    return val; }();

Это лучше, чем написать что-то вроде этого:

widget x;   // should be const, but:
for (auto i = 2; i <= N; ++i) {             // this could be some
    x += some_obj.do_something_with(i);  // arbitrarily long code
}                                        // needed to initialize x
// from here, x should be const, but we can't say so in code in this style

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

Мой вопрос: что делает первый поток безопасным? Как это работает?

1 Ответ

5 голосов
/ 04 ноября 2019

Я полагаю, что в «блоге» упоминается предположение, что использование объекта const должно включать только операции чтения и, следовательно, должно безопасно использоваться в нескольких потоках без синхронизации. Это последнее предложение из этой части "блога":

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

Однако это утверждение, как правило, неверно. Как указывает @VTT, классы могут иметь mutable переменные-члены или, например, ссылочные переменные-члены. Таким образом, нет общей гарантии, что объект const можно безопасно использовать в многопоточном коде без синхронизации.

Вы также можете заметить, что соответствующий элемент ES.28 в C ++Базовое руководство вообще не упоминает многопоточность в контексте этой проблемы.

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