2015-09-28 5 views
6

Wygląda trochę głupie pytanie, ale to dało mi do myślenia ...Czy wątek funkcji standardowego czasu() jest bezpieczny, nawet jeśli podano parametr NULL?

Według here, time ma obowiązek być bezpieczne dla wątków w systemie zgodnym, prawda? To wymaganie obowiązuje niezależnie od parametrów dla funkcji. Kilka funkcji wymieniono jako niewymagane, aby były bezpieczne dla wątków, jeśli podano argument NULL, a time nie zostały uwzględnione.

Wygląda więc na to, że każdy odpowiedni system zgodny z POSIX powinien mieć implementację bezpiecznej dla wątków time.

Czy jednak system POSIX może wdrożyć time_t w sprawie, która faktycznie czyni wskaźnik i nadal jest zgodna? Więc jeśli podano parametr NULL do przechowywania wyniku, to czy nie wszystkie zakłady na jego bezpieczeństwo wątku byłyby wyłączone, ponieważ prawdopodobnie zwróciłby wskaźnik do statycznego magazynu? Czy jest jakiś wymóg lub konwencja dla time_t, której mi brakuje w tym aspekcie?

Jak najlepiej sprawdzać, czy time jest bezpieczne dla wątków na kilku platformach UNIX? W szczególności, AIX, , Krok po demontażu w debugerze może działać, ale implementacje mogą się zmienić.

+6

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html: time_t i clock_t powinna być całkowita lub rzeczywistym pływające typy. Przypisywanie ich powinno być bezpieczne dla wątków. – marcolz

+0

'time' jest wystarczająco głupią funkcją. Nie możemy złamać jego sygnatury ze względu na kompatybilność, ale nie było powodu, aby była jeszcze bardziej głupia i pozwalała implementować wątki niebezpieczne. – MSalters

+0

@marcolz Dziękuję. Nie wiem, jak to przegapiłem. – Kizaru

Odpowiedz

4

Tak, jest bezpieczny dla wątków.

time_t time(NULL); 

Jeśli realizowane wartość wewnętrzną, w którym został zwrócony, to zawsze trzeba skopiować z wartości wewnętrznej wartości zwracanej (zarejestrować się?). Ta kopia sprawiłaby, że będzie bezpieczna dla wątków, ponieważ pasowałaby do wszystkich nowoczesnych procesorów w pojedynczej kopii.

mov eax, static_internal_value 
return 

Wyobraźmy sobie, że nie był to przypadek, i 2 wątki przyszedł Oni zarówno skopiować tę samą wartość. - ponownie, nie mogę zobaczyć, jak to może być błędne.

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

Kilka rzeczy. Nie zdawałem sobie sprawy z wymogu, by 'time_t' był typem całkowitym lub zmiennoprzecinkowym. To wyrzuca moją hipotetyczną sytuację wskaźnika. Po drugie, twój post zakłada atomowy magazyn podwójnego słowa. Co zwykle jest prawdą, ale architektura x86 nie jest łukiem platform, które wymieniłem. Nawet w przypadku wymogu, aby 'time_t' był liczbą całkowitą lub zmiennoprzecinkową, implementacja zgodna może mieć 8 bajtowy' time_t', który może nie mieć ładunku atomowego/magazynu na niektórych platformach. Specyfikacja POSIX mówi, że 'time' jest wymagany do bezpieczeństwa wątków, i tak jest. – Kizaru

Powiązane problemy