有一个新的实验特性(可能是 C++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;
}
我在这里发现的唯一优点是我省去了拥有全局锁的麻烦。使用同步块有更多优点吗?什么时候应该首选?