Skip to content

pthread

Stas edited this page Jan 26, 2026 · 1 revision

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.


🧵 POSIX Threads (pthreads) - Ściąga i Dokumentacja

Zestawienie najważniejszych funkcji biblioteki pthread wykorzystywanej do programowania wielowątkowego w C oraz C++.

1. Zarządzanie Wątkami

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.

2. Muteksy (Synchronizacja Danych)

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.

3. Zmienne Warunkowe (Koordynacja Wątków)

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ą.

💡 Dobre praktyki

  1. Zawsze używaj Muteksu ze Zmienną Warunkową: pthread_cond_wait musi być wywołany wewnątrz zablokowanego muteksu.
  2. Pętla while zamiast if: Zawsze sprawdzaj warunek w pętli while wokół 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);
  1. Kompilacja: Pamiętaj o dodaniu flagi -pthread podczas kompilacji w g++ lub clang++.

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)!

Clone this wiki locally