2011-06-20 16 views
10

Czy errno na wątku MSVC bezpieczne?MSVC errno bezpieczeństwa wątku

Zgodnie z odpowiedziami w this question POSIX wymaga, aby errno było wątkowo bezpieczne. Ale MSVC prawdopodobnie nie jest zgodny z POSIX, a MSDN nic nie mówi o bezpieczeństwie wątków. MSDN sprzeczne wspomina, że ​​errno jest zadeklarowana jako extern int errno;, ale również jako #define errno (*_errno())

+0

Którą wersję Visual C++ używasz? –

+0

@Steve: Obecnie głównie MSVC 2010. –

Odpowiedz

13

Chociaż MSVC jest zdecydowanie nie zgodne z POSIX, errno jest realizowany w czasie wykonywania MSVC (przynajmniej jak na MSVC2008) w THREADSAFE sposób.

Chociaż dokumentacja mówi, że jest to extern int errno, jest zaimplementowana jako #define do funkcji, która pozwala na nałożenie bezpieczeństwa wątku. Jeśli przejdziesz przez tę funkcję w oknie demontażu, jasne jest, że używana jest pamięć lokalna wątku.

Niestety nie mogę wskazać żadnej oficjalnej dokumentacji, która to potwierdza, ale takie jest życie!

2

Nie mogę znaleźć nigdzie na stronie MSDN, gdzie jest to omawiane. Jednak wiele funkcji, które zwracają bufory statyczne, jest już bezpiecznych dla wątków w MSVC (to znaczy zwracają wskaźniki do wątków lokalnych buforów). Więc byłoby zaskakujące, gdyby errno nie było bezpieczne dla wątków.

MSVC nagłówek pliki mają tę definicję:

#ifndef _CRT_ERRNO_DEFINED 
#define _CRT_ERRNO_DEFINED 
_CRTIMP extern int * __cdecl _errno(void); 
#define errno (*_errno()) 

errno_t __cdecl _set_errno(_In_ int _Value); 
errno_t __cdecl _get_errno(_Out_ int * _Value); 
#endif /* _CRT_ERRNO_DEFINED */ 

i mały program testowy showd że 2 wątki ustawienie errno nie przynajmniej nie wpływa siebie. Powiedziałbym, że można bezpiecznie założyć, że errno jest bezpieczne dla wątków (choć prawdopodobnie nie, jeśli łączysz się z jednym wątkiem CRT).

+0

Nie sądzę, że obecnie mają one monokrystaliczny CRT. –

+0

Nie od VS2005 jest to dostępne - patrz http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx –