新しい実験的な機能(おそらくC++ 20)があります。これは「同期ブロック」です。このブロックは、コードセクションにグローバルロックを提供します。次は、cppreferenceの例です。C++の新機能「同期」ブロックにはどんな利点がありますか?
#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();
}
私はそれが余分だと感じます。上記からの同期ブロックの間に違いはありますが、この1:
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;
}
私はここで見つける唯一の利点は、私はグローバルロックを手間を保存してるということです。同期ブロックを使用する利点はありますか?それはいつ優先されるべきですか?その面に
実際にそうであるかどうかはわかりませんが、最初のバージョンがAFAIKの2番目のバージョンではなく、最初のバージョンでは保証されているように見えます。 – NathanOliver
@ NathanOliverなぜ最初のバージョンが順番に印刷されないのですか?あなたは説明できますか?私が理解している限り、一連のコードは一度に一度だけ実行されます。印刷はすべてを順番に実行します。ミューテックスの場合もそうです。 –
"同期化されたブロックはグローバルロックのもとでas-ifを実行しますが、実装は各ブロック内のコードを検査し、トランザクションセーフなコードに対してはオプティミスティックな同時実行性(ハードウェアのトランザクションメモリによってバックアップされます)トランザクションセーフコード " – cpplearner