2013-05-12 16 views
8

Chcę, aby mój program C był przenośny nawet na bardzo starym systemie Unix OS, ale problemem jest to, że używam pthreads i alokacji dynamicznej (malloc). Wszystkie Unixy, które znam, mają bezpieczne dla wątków malloc (Linux, * BSD, Irix, Solaris), jednak nie jest to gwarantowane przez standard C, i jestem pewien, że istnieją bardzo stare wersje, w których nie jest to prawdą.Który Unix nie ma nicolowego malloc?

A więc, czy istnieje lista platform, które musiałbym zawijać przy wywołaniach malloc() z blokadą mutex? Planuję napisać test ./configure, który sprawdza, czy obecna platforma znajduje się na tej liście.

Inną alternatywą byłoby przetestowanie malloc() dla bezpieczeństwa wątków, ale nie znam żadnego deterministycznego sposobu, aby to zrobić. Jakieś pomysły na ten temat?

+0

To pytanie jest istotne tylko dla programistów i dlatego powinno być zadawane na stackoverflow. Prawdopodobnie zostanie tam przeniesiona. –

+8

Bardzo stary Unix nie będzie miał w ogóle "pthreadów" ... – Mat

+4

Standard C nie ma nici - dlatego nie jest "gwarantowany". Posix, który między innymi określa pthreads, gwarantuje to. – nos

Odpowiedz

6

Jedynym standard C, który ma wątków (a więc może to istotne pytanie) jest C11, który stanowi:

Dla celów ustalenia istnienia wyścigu danych, pamięć funkcje alokacji zachowywać się jak chociaż uzyskiwały dostęp tylko do lokalizacji pamięci dostępnych za pośrednictwem ich argumentów, a nie do innego statycznego czasu przechowywania.

Lub innymi słowy, tak długo jak dwa wątki nie przechodzą ten sam adres do realloc lub free wszystkich wywołań funkcji pamięciowych są bezpieczne dla wątków.

POSIX, to wszystko Unix'es, które można znaleźć w dzisiejszych czasach trzeba:

Każda funkcja zdefiniowana w objętości systemu interfejsy IEEE Std 1003.1-2001 jest bezpieczny wątku, chyba że wyraźnie zaznaczono inaczej.

Nie wiem, skąd bierzesz swoje twierdzenie, że malloc nie byłyby wątku bezpieczne dla starszych UNIX-ów system z wątków, które nie implementuje że wątek bezpieczny jest prawie bezużyteczny. Co może być problemem w tak starym systemie, to wydajność, ale zawsze powinna być funkcjonalna.

+0

Dzięki! Więc przypuszczam, że wszystkie programy pithreadów obsługujące Uniksa powinny mieć "malloc()" bezpieczny dla wątków. Ale kiedy przeszukuję internet, stwierdziłem, że implementacja niektórych wersji jest błędna, na przykład patrz [tutaj] (http://sourceware.org/bugzilla/show_bug.cgi?id=6952) i [tutaj] (http://rhn.redhat.com/errata/RHBA-2009-1202.html). Jest więc całkiem możliwe, że napiszę test './Configure', aby uniknąć takich awarii. – jimis

+2

@jimis, pierwszy link do którego się podajesz nie jest błędem, który sprawia, że ​​program nie działa, po prostu wyciek pamięci :) Drugi ma niewiele informacji, więc nie mogę powiedzieć. Ale są to ** błędy ** systemów, w których 'malloc' ma być bezpieczny dla wątków, a nie implementacje wątków, które nie mają bezpiecznego' malloc'. Wszyscy użytkownicy takich systemów ** muszą ** zaktualizować, tak czy inaczej.Korzystając z własnego oprogramowania, nie powinieneś ścigać żadnego możliwego błędu, który mógł istnieć w jakiejś wersji jakiegoś systemu. Przy takim podejściu prawie niemożliwe byłoby osiągnięcie postępu. –

Powiązane problemy