1

従来の POSIX では、errnoは単に整数の左辺値であり、 で完全にうまく機能しますがfork、明らかにスレッドではほとんどうまく機能しません。pthreads によるerrnoと、スレッド ローカルの整数左辺値です。Linux/NTPL では、実装の詳細として、errno は「整数の左辺値を返す関数に展開されるマクロ」です。

私の Debian システムでは のようですが*__errno_location ()、他のシステムでは&(gettib()->errnum.

TL;DRスレッドを作成したことがある
と仮定すると、呼び出して、それが機能することを期待できますか、それとも特別なレイン ダンスを実行する必要がありますか? たとえば、スレッド情報ブロックの特別なフィールドや特別な TLS 値を読み取る必要がありますか? あるいは、glibc が何らかの方法でエラー値を格納するスレッドローカル変数のアドレスを設定する必要がありますか? もしかしてみたいな?cloneerrno__set_errno_location()

それとも「そのまま」でいいのでしょうか?

必然的に、誰かが「単に phtreads を使ってください」と答えたくなりますが、そうしないでください。pthreads は使いたくありません。欲しいclone。私は、pthreads の不適切な機能を望んでいません。また、pthreads の特異な動作に対処したくありません。それらの特異な動作を実装するためのオーバーヘッドも必要ありません。pthread の欠点の多くは、30 年近く前の完全に壊れたシステムで機能しなければならない(そして、驚くべきことに、正常に機能する) 必要があるという事実から来ていることを認識していますが、それはそれがそうであるという意味ではありません。誰にとっても、あらゆる状況にとって、必然的に良いことです。この場合、移植性は問題になりません。
この特定の状況で私が望むのは、親と同じアドレス空間で実行されている別のプロセスを起動し、単純なロック (futex など) を介して同期し、適切にwrite動作することです (つまり、正しく読み取ることができる必要があります)errno。 . オーバーヘッドをできるだけ少なくし、他の機能や特別な動作を必要とせず、必要とさえしません。

4

2 に答える 2

0

errno がスレッド ローカル変数の場合、clone() はそれを新しいプロセスのアドレス空間にコピーしますか? 2001 年頃のように errno_location() 関数を上書きして、pid に基づく errno を使用していました。

http://tamtrajnana.blogspot.com/2012/03/thread-safety-of-errno-variable.html

errno が「__thread int errno;」として定義されているためです。(上記のコメントを参照) これは __thread タイプがどのように処理されるかを説明しています: Linux's thread local storage implementation

于 2013-11-18T04:59:20.157 に答える