C ++スレッドとPOSIXスレッドを使用してマルチスレッドアプリケーションを作成しました。ここで、ブールフラグが設定される(trueになる)までスレッド(メインスレッド)をブロックする必要があります。
私はこれを成し遂げるために2つの方法を見つけました。
睡眠なしでループを回転します。
while(!flag);
睡眠を伴うループを回転します。
while(!flag){
sleep(some_int);
}
私が最初の方法に従う必要がある場合、なぜ一部の人々は2番目の方法に従ってコードを書くのですか?2番目の方法を使用する必要がある場合、なぜ現在のスレッドをスリープ状態にする必要があるのでしょうか。そして、この方法の欠点は何ですか?
最初のオプション(「ビジーウェイト」)は、待機期間中コア全体を浪費し、他の有用な作業が行われたり、エネルギーを浪費したりするのを防ぎます。
2番目のオプションは無駄が少なくなります。待機中のスレッドはCPUをほとんど使用せず、他のスレッドを実行できます。しかし、フラグをチェックするためにスレッドに切り替え続けるのはまだ無駄です。
どちらよりもはるかに優れているのは、条件変数を使用することです。これにより、待機中のスレッドは、続行できるようになるまでリソースを消費せずにブロックできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加