pthreads - pthreads

POSIX Threads , comumente conhecido como pthreads , é um modelo de execução que existe independentemente de uma linguagem, bem como um modelo de execução paralela. Ele permite que um programa controle vários fluxos de trabalho diferentes que se sobrepõem no tempo. Cada fluxo de trabalho é conhecido como thread , e a criação e o controle sobre esses fluxos são obtidos fazendo chamadas para a API POSIX Threads. POSIX Threads é uma API definida pelo padrão POSIX.1c, extensões de Threads ( IEEE Std 1003.1c-1995) .

Implementações da API estão disponíveis em muitos sistemas operacionais em conformidade com POSIX, como o Unix , como FreeBSD , NetBSD , OpenBSD , Linux , macOS , Android , Solaris , Redox e AUTOSAR Adaptive, tipicamente agrupados como uma biblioteca libpthread . Também existem implementações de DR-DOS e Microsoft Windows : dentro do subsistema SFU / SUA , que fornece uma implementação nativa de uma série de APIs POSIX, e também em pacotes de terceiros , como pthreads-w32 , que implementa pthreads sobre a API do Windows existente .

Conteúdo

pthreads define um conjunto de tipos , funções e constantes da linguagem de programação C. Ele é implementado com um cabeçalho e uma biblioteca de threads . pthread.h

Existem cerca de 100 procedimentos de threads, todos prefixados pthread_e podem ser categorizados em quatro grupos:

A API do semáforo POSIX funciona com threads POSIX, mas não faz parte do padrão de threads, tendo sido definida no padrão POSIX.1b, extensões em tempo real (IEEE Std 1003.1b-1993) . Conseqüentemente, os procedimentos do semáforo são prefixados por em sem_vez de pthread_.

Exemplo

Um exemplo que ilustra o uso de pthreads em 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);
  return NULL;
}

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;
}

Este programa cria cinco threads, cada uma executando a função perform_work que imprime o número exclusivo desta thread na saída padrão. Se um programador quisesse que os threads se comunicassem entre si, isso exigiria a definição de uma variável fora do escopo de qualquer uma das funções, tornando-a uma variável global . Este programa pode ser compilado usando o compilador gcc com o seguinte comando:

gcc pthreads_demo.c -pthread -o pthreads_demo

Aqui está uma das muitas saídas possíveis da execução deste programa.

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.

Threads POSIX para Windows

O Windows não oferece suporte nativo ao padrão pthreads , portanto, o projeto Pthreads4w busca fornecer uma implementação de wrapper portátil e de código aberto. Também pode ser usado para portar software Unix (que usa pthreads ) com pouca ou nenhuma modificação na plataforma Windows. Pthreads4w versão 3.0.0 ou posterior, lançado sob a Apache Public License v2.0, é compatível com sistemas Windows de 64 ou 32 bits. A versão 2.11.0, lançada sob a licença LGPLv3, também é compatível com 64 ou 32 bits.

O projeto Mingw-w64 também contém uma implementação de wrapper de pthreads , winpthreads , que tenta usar mais chamadas de sistema nativas do que o projeto Pthreads4w.

O subsistema de ambiente Interix disponível no pacote Windows Services for UNIX / Subsystem for UNIX-based Applications fornece uma porta nativa da API pthreads , ou seja, não mapeada na API Win32 / Win64, mas construída diretamente na interface syscall do sistema operacional .

Veja também

Referências

Leitura adicional

links externos