POSIX Threads - POSIX Threads

  (Przekierowująca Pthread tworzyć )

POSIX , zwykle określane jako pthreads , jest modelem realizacji , który istnieje niezależnie od języka, a także równolegle modelu wykonania. Pozwala to program do kontrolowania wielu różnych przepływów pracy, które pokrywają się w czasie. Każdy przepływ pracy jest określany jako nici oraz tworzenia i kontroli tych przepływów jest osiągane poprzez połączenia do API POSIX Threads. POSIX Nici jest API określone przez normę POSIX.1c, nici przedłużenia ( IEEE Std 1003.1c-1995) .

Implementacje interfejsu API są dostępne na wielu uniksowych POSIX-zgodnymi systemami operacyjnymi, takimi jak FreeBSD , NetBSD , OpenBSD , Linux , MacOS , Android , Solaris , Redox i AUTOSAR adaptacyjnej, zazwyczaj dołączane jako biblioteka libpthread . DR-DOS and Microsoft Windows implementacje istnieć również: w SFU / SUA podsystemu, który zapewnia natywną realizację szeregu POSIX API, a także w innych producentów opakowań, takich jak Pthreads-W32, Który realizuje pthreads na szczycie istniejącej Windows API .

Zawartość

pthreads definiuje zbiór C języka programowania typów , funkcji i stałych. Jest on realizowany w pthread.hnagłówku i nitki biblioteki .

Istnieje około 100 nici procedury, wszystko z prefiksem pthread_i można je podzielić na cztery grupy:

POSIX semaforów API współpracuje z wątków, ale nie jest częścią wątków standard, które zostały zdefiniowane w (1003.1b-1993 IEEE Std) POSIX.1b, przedłużanie czasu rzeczywistego standardu. W związku z tym, procedury semafor są poprzedzone sem_zamiast pthread_.

Przykład

Przykład ilustrujący wykorzystanie pthreads C:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <pthread.h>
#include <unistd.h>

#define NUM_THREADS 5

void *perform_work(void *arguments){
  int index = *((int *)arguments);
  int sleep_time = 1 + rand() % NUM_THREADS;
  printf("THREAD %d: Started.\n", index);
  printf("THREAD %d: Will be sleeping for %d seconds.\n", index, sleep_time);
  sleep(sleep_time);
  printf("THREAD %d: Ended.\n", index);
  
}

int main(void) {
  pthread_t threads[NUM_THREADS];
  int thread_args[NUM_THREADS];
  int i;
  int result_code;
  
  //create all threads one by one
  for (i = 0; i < NUM_THREADS; i++) {
    printf("IN MAIN: Creating thread %d.\n", i);
    thread_args[i] = i;
    result_code = pthread_create(&threads[i], NULL, perform_work, &thread_args[i]);
    assert(!result_code);
  }

  printf("IN MAIN: All threads are created.\n");

  //wait for each thread to complete
  for (i = 0; i < NUM_THREADS; i++) {
    result_code = pthread_join(threads[i], NULL);
    assert(!result_code);
    printf("IN MAIN: Thread %d has ended.\n", i);
  }

  printf("MAIN program has ended.\n");
  return 0;
}

Ten program tworzy pięć wątków, każdy wykonywania funkcji perform_work który drukuje unikalny numer tego wątku na standardowe wyjście. Jeśli programista chciał nici do komunikowania się ze sobą, wymagałoby to zdefiniowanie zmiennej poza zakresem dowolnej funkcji, co sprawia, że jest to zmienna globalna . Ten program może być skompilowany przy użyciu gcc kompilatora za pomocą następującego polecenia:

gcc pthreads_demo.c -lpthread -o pthreads_demo

Oto jeden z wielu możliwych wyjść z uruchomieniem tego programu.

IN MAIN: Creating thread 0.
IN MAIN: Creating thread 1.
IN MAIN: Creating thread 2.
IN MAIN: Creating thread 3.
THREAD 0: Started.
IN MAIN: Creating thread 4.
THREAD 3: Started.
THREAD 2: Started.
THREAD 0: Will be sleeping for 3 seconds.
THREAD 1: Started.
THREAD 1: Will be sleeping for 5 seconds.
THREAD 2: Will be sleeping for 4 seconds.
THREAD 4: Started.
THREAD 4: Will be sleeping for 1 seconds.
IN MAIN: All threads are created.
THREAD 3: Will be sleeping for 4 seconds.
THREAD 4: Ended.
THREAD 0: Ended.
IN MAIN: Thread 0 has ended.
THREAD 2: Ended.
THREAD 3: Ended.
THREAD 1: Ended.
IN MAIN: Thread 1 has ended.
IN MAIN: Thread 2 has ended.
IN MAIN: Thread 3 has ended.
IN MAIN: Thread 4 has ended.
MAIN program has ended.

POSIX Threads dla Windows

Windows nie obsługują pthreads standardowy natywnie, dlatego Pthreads-W32 projekt ma na celu dostarczenie przenośnego i open-source otoki realizacji. Może być również stosowany do portu Unix oprogramowania (który używa pthreads ) z małym lub bez modyfikacji na platformę Windows. Z dodatkowymi łatami ostatnia wersja 2.8.0 jest kompatybilny z 64-bitowymi systemami Windows. 2.9.0 mówi się również 64-bitowa kompatybilna.

Projekt MinGW-W64 zawiera również realizację owinięciu z pthreads , winpthreads , który próbuje użyć więcej rodzimych wywołań systemowych niż Pthreads-W32 projektu.

Interix podsystem dostępne w środowisku Windows Services for UNIX / Podsystem aplikacji systemu UNIX pakiet zapewnia natywną port Pthreads API, czyli nie odwzorowywane na Win32 / Win64 API, ale wbudowany bezpośrednio w system operacyjny syscall interfejsu.

Zobacz też

Bibliografia

Dalsza lektura

Zewnętrzne linki