Появилась новая экспериментальная функция (возможно, С++ 20), которая является "синхронизированным блоком". Блок обеспечивает глобальную блокировку раздела кода. Ниже приведен пример из cppreference.
#include <iostream>
#include <vector>
#include <thread>
int f()
{
static int i = 0;
synchronized {
std::cout << i << " -> ";
++i;
std::cout << i << '\n';
return i;
}
}
int main()
{
std::vector<std::thread> v(10);
for(auto& t: v)
t = std::thread([]{ for(int n = 0; n < 10; ++n) f(); });
for(auto& t: v)
t.join();
}
Я чувствую это излишним. Есть ли разница между синхронизированным блоком сверху и этим:
std::mutex m;
int f()
{
static int i = 0;
std::lock_guard<std::mutex> lg(m);
std::cout << i << " -> ";
++i;
std::cout << i << '\n';
return i;
}
Единственное преимущество, которое я нахожу здесь, это то, что я избавил от необходимости иметь глобальный замок. Есть ли больше преимуществ использования синхронизированного блока? Когда это должно быть предпочтительным?