Jak utworzyć bibliotekę, która używa muteksów tylko wtedy, gdy pthread jest połączony?

Tworzę bibliotekę C na Linuksie, która ma kilka funkcji, które razem działają na niektórych danych globalnych. Aby funkcje te były bezpieczne dla wątków, muszą stosować muteksy w odpowiednich punktach kodu.

W Linuksie, aby użyć pthreads w aplikacji, należy połączyć się z odpowiednią biblioteką,-lpthread. W przypadku mojej skompilowanej biblioteki chciałbym, aby działała zarówno, jeśli użytkownik zdecydował się na użycie pthreads w swojej aplikacji, jak i jeśli nie.

W przypadku, gdy deweloper nie używa wątków w swojej aplikacji, nie będą łączyć się z wątkami pthreads. Dlatego chciałbym, aby moja skompilowana biblioteka nie wymagała tego, a ponadto stosowanie muteksów w aplikacji z jednym wątkiem wymaga niepotrzebnego narzutu (nie wspominając o głupocie).

Czy istnieje jakiś sposób na napisanie kodu (w razie potrzeby z rozszerzeniami GCC), że pewien blok kodu zostanie uruchomiony tylko wtedy, gdy określone symbole zostaną połączone? Wiem, że mogę z niego korzystaćdlopen () i przyjaciele, ale to samo w sobie wymagałoby tego, czego próbuję uniknąć. Wyobrażam sobie, że to, czego szukam, musi istnieć, ponieważ kilka standardowych funkcji znajduje się w tej samej łodzi i wymagałoby muteksów, aby były bezpieczne dla wątków (i są), ale działają nawet wtedy, gdy nie są połączone z pthreads.

W tym miejscu zauważam toFunkcja popen () FreeBSD w linii 66 i 67 stosuje się czek nieprzenośny -isthreaded, aby określić, czy wątki są używane, czy nie, i czy używać muteksów. Wątpię, by coś takiego było w jakikolwiek sposób znormalizowane. Co więcej, taki kod nie może się kompilować i łączyć, jeśli symbole nie są rozpoznawane, co w Linuksie symbole mutexu nie będą nawet obecne, jeśli pthread nie jest połączony.

Podsumowując: w Linuksie, w jaki sposób tworzy się bibliotekę, która wie, kiedy są również używane wątki, a jeśli tak, to w razie potrzeby stosuje muteksy i nie wymaga łączenia z pthreads, chyba że twórca aplikacji chce gdzieś korzystać z wątków?

questionAnswers(2)

yourAnswerToTheQuestion