2015-09-28 6 views
6

は愚かな質問のビットのように思えるが、それは私が...考えhereによるとC標準のtime()関数はNULLパラメータを指定してもスレッドセーフですか?

timeが正しい、準拠システム上でスレッドセーフであることが要求されましたか?この要件は、関数のパラメータに関係なく保持されます。いくつかの関数は、NULL引数を指定するとスレッドセーフである必要はなく、timeは含まれていません。

したがって、POSIX準拠のシステムでは、スレッドセーフな実装がtimeである必要があります。

しかし、POSIXシステムではtime_tを実際にポインタにしていてもそれに準拠して実装することができますか?したがって、結果を格納するためのNULLパラメータが提供されている場合、静的記憶域へのポインタを返す可能性があるため、スレッドセーフティのすべてのベットがオフになるわけではありませんか?または、私がこの面で紛失しているtime_tのためのいくつかの要件またはコンベンションがありますか?

UNIXプラットフォームでtimeがスレッドセーフであることを確認するにはどうすればよいでしょうか?特に、AIX,HP-UX,LinuxおよびSolarisが好ましい。デバッガで逆アセンブリを実行すると機能する可能性がありますが、実装が変更される可能性があります。

+6

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html:time_t型とclock_tは、整数や実数、浮動小数点型でなければなりません。それらを割り当てることはスレッドセーフでなければなりません。 – marcolz

+0

'time'はそのまま愚かな機能です。互換性の理由からシグネチャを破棄することはできませんが、スレッドを安全でなく実装することはほとんどありませんでした。 – MSalters

+0

@marcolzありがとう。どのように私はそれを逃したか分からない。 – Kizaru

答えて

4

はいスレッドセーフです。

time_t time(NULL); 

内部値を実装した場合、返された時点で、常に内部値から戻り値(レジスタ?)にコピーする必要があります。そのコピーはすべての最新のプロセッサーの単一コピーに収まるようにスレッドセーフなものにするでしょう。

mov eax, static_internal_value 
return 

それはそうではなかった想像し、そして2つのスレッドが入って来た彼らは両方とも同じ値をコピーする - 。再び、これは正しくない可能性がどのように見ることができません。

thread 1         thread 2 
              mov eax, static_internal_value 
mov eax, static_internal_value 
return 
              return 
+0

いくつかあります。私は 'time_t'が整数型または浮動小数点型であるという要件を認識していませんでした。それは私の仮説的ポインタ状況を投げる。第二に、あなたのポストはアトミックなダブルワードストアを想定しています。これは普通は当てはまりますが、x86アーキテクチャは私が挙げたプラットフォームのアーチではありません。 'time_t'を整数または浮動小数点にする必要があっても、準拠している実装では8バイトの' time_t'を持つことができます。これはいくつかのプラットフォームで原子ロード/ストアを持たないかもしれません。 POSIX仕様では、 'time'はスレッドセーフである必要があると言われています。 – Kizaru

関連する問題