2012-08-17 9 views
5

Piszę wspólną bibliotekę w C. Wiem, że funkcje C nie są bezpieczne dla wątków.Tworzenie bezpiecznej biblioteki C

Moi funkcje biblioteczne wygląda,

struct lib_handle { 
.... 
}; 

int lib_init(lib_handle **handle); 
int lib_process(lib_handle *handle); 
.... 
.... 

Każda metoda pobiera wskaźnik do lib_handle obiektu. Cały stan jest przechowywany wewnątrz tej struktury. Nie są używane żadne zmienne globalne.

Zakładam, że jeśli każdy wątek tworzy własne instancje lib_handle, wiele wątków może korzystać z funkcji biblioteki. Ponieważ każdy wątek ma swój własny uchwyt, everythibg powinien działać.

Nie zweryfikowałem jeszcze tego założenia. Zastanawiam się, co myślicie o tym projekcie i czy możecie powiedzieć, że moja biblioteka jest bezpieczna dla wątków, ponieważ każdy wątek ma swoje własne uchwyty?

Każda pomoc będzie świetna!

+0

Ta biblioteka nie korzysta z żadnych bibliotek innych niż SQLite. Sam SQLite jest bezpieczny dla wątków. –

+0

Hej, +1, w końcu rozsądne pytanie. –

Odpowiedz

3

To spowoduje, że dane/stan wątku biblioteki będą bezpieczne.

Należy jednak upewnić się, że biblioteka używa funkcji wątków z innych bibliotek, np. użyj strtok_r zamiast strtok.

+0

Tak. Masz rację. A co z innymi funkcjami standardowych funkcji bibliotecznych? –

+0

@Appu Zwykle standardowe funkcje są wątkowo bezpieczne, chyba że podano inaczej. Najlepiej jest spojrzeć na stronę man tej funkcji. – Rohan

1

Wątki działają w obszarze pamięci współużytkowanej. Niebezpieczne obiekty to obiekty, do których dostęp można uzyskać jednocześnie za pomocą wielu wątków. Więc jeśli masz pojedynczy obiekt lib_handle dla każdego wątku, nie będzie problemów.

0

Jeśli każdy wątek ma prywatny obiekt lib_handle, biblioteka powinna być w pełni bezpieczna dla wątków; jeśli pozwolisz kilku wątkom współdzielić lib_handle obiekty, osoba korzystająca z twojej biblioteki może nadal tworzyć program bezpieczny dla wątków, jeśli poprawnie używa twojej biblioteki (tzn. twoja biblioteka nie jest z natury niebezpieczna dla wątków, która byłaby, gdybyś użył np. zmiennych globalnych).

Jeśli ten tryb działania (shared lib_handle) jest interesujący, należy wyraźnie oddzielić funkcje, które tylko odczytują stan lib_handle i te, które manipulują stanem lib_handle. Pierwszy z nich wymaga blokady odczytu, a drugi wymaga blokady zapisu (zakres wywoływania musi obsłużyć to).

Za to, co jest warte, użyłem wzoru, który opisujesz całkiem sporo i lubisz.

Powiązane problemy