このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
複数のスレッドが同じ条件変数を待機しています
cnd_signal
または std::condition_variable::notify_one()
を使用して同じ条件変数を待機しているいずれかのスレッドに通知すると、無期限のブロッキングにつながる可能性がある
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、cnd_signal
ファミリ関数または関数 std::condition_variable::notify_one()
を使用して、同じ条件変数を同時に待機している少なくとも 2 つのスレッドのいずれかに通知した場合に発生します。優先順位が同じスレッドの場合は、これらの関数により、条件変数を待機しているいずれかのスレッドをスレッド スケジューラが自動で選択し通知します。
Polyspace は関数呼び出しでこのチェックを報告します。同じ条件変数を待機しているスレッドを確認するには、[結果の詳細] ペインで [イベント] 列を参照してください。
リスク
複数のスレッドで同じ条件変数を使用している場合は、cnd_signal
ファミリ関数または関数 std::condition_variable::notify_one()
が、待機しているいずれかのスレッドを任意に選んで通知します。通知されたスレッドは、通常、条件述部を検査します。条件述部が false の場合は、再度通知されるまでスレッドは待機し続けます。このメソッドは任意のスレッドを選んで通知するので、通知されるスレッドの条件術部が true
にならない可能性があります。プログラムは、条件変数を通知するスレッドがいずれも起動していない状態となり、無期限のブロッキングにつながる可能性があります。
修正方法
cnd_broadcast
ファミリ関数または関数 std::condition_variable::notify_all()
を使用して、条件変数を待機しているすべてのスレッドに通知するか、スレッドごとに別々の条件変数を使用します。
例
結果情報
グループ: 同時実行 |
言語: C | C++ |
既定値: オフ |
コマンド ライン構文: SIGNALED_COND_VAR_NOT_UNIQUE |
影響度: Low |
バージョン履歴
R2020a で導入
参考
欠陥の検出 (-checkers)
| 誤って失敗する可能性のある関数はループでラップされません
| 誤って起動する可能性のある関数はループでラップされません
| データ レース
| ロック解除されていません
| ロックされていません
| デッドロック
| 1 つの条件変数をもつ複数のミューテックス