Repository navigation
pthread
Oto gotowa notatka w formacie Markdown, którą możesz wkleić bezpośrednio do swojego GitHub Wiki. Skupiłem się na najważniejszych funkcjach, o które pytałeś, w tym na wątkach, muteksach i zmiennych warunkowych.
Zestawienie najważniejszych funkcji biblioteki pthread wykorzystywanej do programowania wielowątkowego w C oraz C++.
Podstawowe funkcje do tworzenia i kończenia pracy wątków.
pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);-
Tworzy nowy wątek.
-
thread: Wskaźnik na identyfikator wątku. -
start_routine: Funkcja, którą wątek ma wykonać. -
arg: Argument przekazywany do funkcji wątku. -
pthread_join
int pthread_join(pthread_t thread, void **retval);-
Czeka na zakończenie konkretnego wątku (blokuje wywołujący wątek).
-
Odpowiednik "czekania na wynik" i sprzątania po wątku.
-
pthread_exit
void pthread_exit(void *retval);-
Kończy działanie bieżącego wątku i zwraca wartość.
-
pthread_detach
int pthread_detach(pthread_t thread);- Oznacza wątek jako odłączony. Zasoby zostaną zwolnione automatycznie po zakończeniu, bez potrzeby wywoływania
pthread_join.
Służą do ochrony sekcji krytycznych i zapobiegania "race conditions" (np. przy dopisywaniu do std::vector).
pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);-
Inicjalizuje nowy muteks.
-
pthread_mutex_lock
int pthread_mutex_lock(pthread_mutex_t *mutex);-
Blokuje muteks. Jeśli jest zajęty, wątek czeka aż zostanie zwolniony.
-
pthread_mutex_unlock
int pthread_mutex_unlock(pthread_mutex_t *mutex);-
Zwalnia blokadę muteksu, umożliwiając innym wątkom dostęp.
-
pthread_mutex_destroy
int pthread_mutex_destroy(pthread_mutex_t *mutex);- Usuwa muteks i zwalnia jego zasoby.
Pozwalają wątkom zasypiać i budzić się na sygnał (np. gdy dane z Postgresa pojawią się w buforze).
pthread_cond_init
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);-
Inicjalizuje zmienną warunkową.
-
pthread_cond_wait
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);-
Najważniejsza funkcja: uśpienie wątku, zwolnienie muteksu i oczekiwanie na sygnał. Po przebudzeniu automatycznie ponownie blokuje muteks.
-
pthread_cond_signal
int pthread_cond_signal(pthread_cond_t *cond);-
Budzi jeden wątek oczekujący na tej zmiennej.
-
pthread_cond_broadcast
int pthread_cond_broadcast(pthread_cond_t *cond);-
Budzi wszystkie wątki oczekujące na tej zmiennej.
-
pthread_cond_destroy
int pthread_cond_destroy(pthread_cond_t *cond);- Usuwa zmienną warunkową.
-
Zawsze używaj Muteksu ze Zmienną Warunkową:
pthread_cond_waitmusi być wywołany wewnątrz zablokowanego muteksu. -
Pętla
whilezamiastif: Zawsze sprawdzaj warunek w pętliwhilewokółpthread_cond_wait, aby uniknąć tzw. "fałszywych przebudzeń" (spurious wakeups).
pthread_mutex_lock(&lock);
while (data_not_ready) {
pthread_cond_wait(&cond, &lock);
}
// Praca na danych...
pthread_mutex_unlock(&lock);-
Kompilacja: Pamiętaj o dodaniu flagi
-pthreadpodczas kompilacji wg++lubclang++.
Wskazówka: Jeśli używasz standardu C++11 lub nowszego, rozważ użycie std::thread, std::mutex oraz std::condition_variable – oferują one bezpieczniejszy i nowocześniejszy interfejs dla tych samych mechanizmów.
Możesz też dodać do tej notatki link do swojego folderu z projektem, który nazwaliśmy wcześniej (np. pg-parallel-core)!