たまにタイマーを起動するシステムレベルのコードがあり、これらの信号が到着したときにそれらを管理する信号ハンドラーがあります。これは正常に機能し、完全に合理的なようです。メインプログラムと一緒に実行されている2つの別個のスレッドもありますが、それらは変数を共有しませんが、glibの非同期キューを使用してメッセージを一方向にのみ渡します。
同じコードでglibを使用しGHashTable
て、キーと値のペアを格納しています。シグナルコードがシステムからコメントアウトされると、ハッシュテーブルは正常に動作しているように見えます。ただし、有効にすると、呼び出しが実際にNULLを返すという奇妙な競合状態が発生しg_hash_table_lookup
ます(つまり、検索に使用されたキーを持つエントリがないことを意味します)。実際にエントリが存在する場合(はい、確認しました)キーと値のペアのリスト全体をg_hash_table_foreach
)で出力します。なぜこれがほとんどの場合に発生するのでしょうか?GLibのハッシュテーブルの実装はバグがありますか?ルックアップ呼び出しが成功する場合があります。
これは非常に特殊な状況であり、意味がない場合はさらに明確にすることができますが、これを実際に修正できるように、何か間違ったことをしていることを望んでいます。
詳細:シグナルハンドラスコープ内にないがg_hash_table変数にアクセスするコードセグメントは、シグナルブロッキング呼び出しに囲まれているため、プロセスが最初にこれらの変数にアクセスしていたときに、シグナルハンドラはこれらの変数にもアクセスしません。