ロック保持中のブロック操作
ロック保持中のタスクによる長時間かかる操作の実行
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、タスク (スレッド) がロックを保持しながら時間がかかる可能性のある操作を実行した場合に発生します。
チェッカーは、以下の関数の呼び出しを長時間かかる可能性があると見なします。
recvなどのネットワークにアクセスする関数fork、pipe、systemなどのシステム呼び出し関数getcharやscanfなどの I/O 操作用の関数fopen、remove、lstatなどのファイル処理関数mkdirやrmdirなどのディレクトリ操作関数
チェッカーは、ロックの保持および解放を行う特定のプリミティブ型 (たとえば、pthread_mutex_lock や pthread_mutex_unlock) を自動的に検出します。自動的に検出されるすべてのプリミティブ型のリストは、Polyspace でのスレッド作成とクリティカル セクションの自動検出を参照してください。
リスク
スレッドでロックの保持中に長時間かかる操作を実行すると、そのロックを使用する他のスレッドはロックが使用可能になるまで待機しなければなりません。その結果、システム パフォーマンスが低下したり、デッドロックが発生する可能性があります。
修正方法
ロックが保持される前か、ロックが解放された後にブロック操作を実行します。
このチェッカーで検出される一部の関数は、時間がかからない可能性のある方法で呼び出すことができます。たとえば、関数 recv は、利用可能なメッセージがない場合に呼び出しが失敗するようになるパラメーター O_NONBLOCK を指定して呼び出せます。このパラメーターを指定して呼び出すと、recv はメッセージが利用可能になるまで待機しません。
例
結果情報
| グループ: 同時実行 |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: BLOCKING_WHILE_LOCKED |
| 影響度: Low |
バージョン履歴
R2018b で導入