4

ご存知のように、シグナル ハンドラで何かを行うのは、割り込みのようなコンテキストで実行されるため、非常に悪いことです。シグナル ハンドラが呼び出されたときに、さまざまなロック (malloc() ヒープ ロックを含む!) が保持される可能性は十分にあります。

そのため、シグナルメカニズムを使用せずにスレッドセーフタイマーを実装したいと考えています。

どのようにできるのか?

申し訳ありませんが、実際には、スレッドセーフに関する回答は期待していませんが、スレッドセーフな Unix または Linux でのタイマーの実装に関する回答は期待していません。

4

4 に答える 4

4

スレッドで usleep(3) または sleep(3) を使用します。これにより、タイムアウトが期限切れになるまでスレッドがブロックされます。

I/O を待つ必要があり、I/O の準備が整う前にタイマーの期限が切れる場合は、select(2)、poll(2)、または epoll(7) をタイムアウト付きで使用します。

それでもシグナル ハンドラを使用する必要がある場合は、pipe(2) でパイプを作成するか、スレッドの読み取り側でブロック読み取りを行うか、select/poll/epoll を使用して準備が整うまで待機し、バイトを書き込みます。 write(2) を使用して、シグナル ハンドラ内のパイプの書き込み側に書き込みます。パイプに何を書き込むかは問題ではありません。アイデアは、スレッドを起動させることです。1 つのパイプでシグナルを多重化したい場合は、シグナル番号またはその他の ID をパイプに書き込みます。

于 2009-03-23T09:01:05.393 に答える
1

あなたが説明する問題を回避する通常の方法は、シグナルハンドラーに最小限の作業のみを行わせることだと思います。たとえば、いくつかの timer_expired フラグを設定します。次に、フラグが設定されているかどうかを定期的にチェックし、実際の作業を行うスレッドがあります。

シグナルを使用したくない場合は、指定された時間、スレッドをスリープまたはビジー待機にする必要があると思います。

于 2009-03-23T07:19:42.347 に答える
1

pthreadsおそらく、POSIX スレッド ライブラリのようなものを使用する必要があります。スレッド自体だけでなく、ミューテックス (ロック)、条件、セマフォなどの基本的な同期プリミティブも提供します。これは私が見つけたまともなチュートリアルです: http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

マルチスレッド プログラミングにまったく慣れていない場合は、C よりも Java か Python のどちらかを知っていれば、少し簡単に学習できるかもしれません。

于 2009-03-23T06:14:16.807 に答える