明らかに、GIL は参照カウントを保護するためにスレッド間のコンテキストの切り替えを防ぎますが、シグナル処理は CPython で完全に安全ですか?
2 に答える
シグナルは、参照カウント操作の途中で配信および処理される可能性があります。なぜ CPython が参照カウントにアトミック CPU 命令を使用しないのか疑問に思っている場合: それらは遅すぎます。アトミック操作では、メモリ バリアを使用して、CPU キャッシュ (L1、L2、共有 L3) と CPU (ccNUMA) を同期します。ご想像のとおり、多くの最適化が妨げられます。最新の CPU は非常に高速であり、データを待つ以外に何もしないことに多くの時間を費やしています。参照のインクリメントとデクリメントは、CPython で非常に一般的な操作です。メモリ バリアは、非常に重要な最適化のトリックである順不同の実行を防ぎます。
参照カウント コードは注意深く作成されており、マルチスレッドとシグナルが考慮されています。シグナル ハンドラーは、スレッドがアクセスできないのと同様に、部分的に作成または破棄された Python オブジェクトにアクセスすることはできません。Py_CLEAR
エッジケースを処理するようなマクロ。I/O 関数も EINTR を処理します。3.3 には、fork() と execvpe() の間で async-signal-safe 関数のみを使用する改良された subprocess モジュールがあります。
心配する必要はありません。POSIX fu をよく知っている賢い人たちがいます。