1

strace(1)私はのをやったpthread_create(3)。システムコールを間接的に呼び出しclone(2)ます。

そして、次のフラグが設定されます: (私は i386 GNU/Linux (Mint 13) を使用しています)

CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID

私はこれですべてのフラグが得意です。しかし、私の質問は、なぜフラグpthread_create()を設定するのですか? CLONE_CHILD_CLEARTID私の知る限りでは、CLONE_CHILD_SETTID子スレッド ID を子メモリの ctid の位置に設定しCLONE_CHILD_CLEARTID、子が終了する間にそれを消去します。

CLONE_CHILD_SETTIDフラグが設定されていないため、なぜCLONE_CHILD_CLEARTIDですか?)

本当に必要ですか?pthread_create()を使用する機能を実現したい場合に設定する必要がある理想的なフラグは何clone(2)ですか?

この分野の初心者。

4

1 に答える 1

5

pthread_createまあ、だけを使用して複製することはできませんcloneclonepthreads などによるライブラリの使用をサポートするために書かれていますが、それ自体は基本的に非常にカスタマイズ可能なスレッド フォーク関数です。

CLONE_CHILD_CLEARTIDたとえば、 は をサポートするように設計されていpthread_joinます。それが本質的に行うことは、 の値をゼロにしてctidから、そのアドレスで futex_wait を呼び出したスレッドをウェイクアップすることです。したがって、がゼロpthread_joinかどうかを確認するだけで実装できctid(ゼロの場合はすぐにステータスを返します)、必要に応じて futex_wait を実行します (適切な同期を前提としています)。

基本的にcloneは の不可欠な部分ですpthread_createが、それだけではありません。基本的に pthreads が提供するすべてのものと同様に、より高度な使用法をサポートするには、ライブラリ コードcloneとその他の呼び出しを作成する必要があります。

于 2012-08-28T06:28:55.173 に答える