POSIX Threads - POSIX Threads

  (Redirecionado de Pthread criar )

POSIX Threads , geralmente referidos como pthreads , é um modelo de execução que existe independentemente de uma língua, bem como um modelo de execução paralela. Ele permite que um programa para controlar vários fluxos diferentes de trabalho que se sobrepõem no tempo. Cada fluxo de trabalho é referido como um fio , e da criação e controle sobre esses fluxos é conseguido fazendo chamadas para a API POSIX Threads. POSIX Fios é uma API definido pela norma POSIX.1c, Fios extensões ( IEEE Std 1003.1c-1995) .

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

Conteúdo

pthreads define um conjunto de C linguagem de programação tipos , funções e constantes. Ele é implementado com um pthread.hcabeçalho e um fio biblioteca .

Há cerca de 100 linhas, todos os procedimentos prefixado pthread_e eles podem ser categorizados em quatro grupos:

O POSIX semáforos API trabalha com threads POSIX, mas não é parte de tópicos padrão, tendo sido definidos no (1003.1b-1993 IEEE Std) POSIX.1b, extensões em tempo real padrão. Por conseguinte, os procedimentos de semáforo são precedidos por sem_, em vez de pthread_.

Exemplo

Um exemplo ilustrando a utilização 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);
  
}

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 tópicos, cada um executando a função perform_work que imprime o número único deste segmento para a saída padrão. Se um programador queria os fios para se comunicar uns com os outros, isso exigiria a definição de um fora variável do escopo de qualquer uma das funções, tornando-se uma variável global . Este programa pode ser compilado usando o gcc compilador com o seguinte comando:

gcc pthreads_demo.c -lpthread -o pthreads_demo

Aqui está uma das muitas saídas possíveis de executar esse 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.

POSIX Threads para Windows

O Windows não suporta os pthreads padrão nativamente, portanto, o Pthreads-w32 projeto visa proporcionar um portátil e de código aberto invólucro implementação. Ele também pode ser usado para a porta Unix software (que usa pthreads ) com pouca ou nenhuma modificação para a plataforma Windows. Com algumas correções adicionais a última versão 2.8.0 é compatível com sistemas Windows de 64 bits. 2.9.0 é dito para ser também compatível com 64 bits.

O projeto mingw-w64 também contém uma implementação invólucro de pthreads , winpthreads , que tenta usar chamadas de sistema mais nativos que os Pthreads-w32 projeto.

Interix subsistema de ambiente disponível nos Windows Services for UNIX / subsistema para aplicativos baseados em UNIX pacote fornece uma porta nativa do pthreads API, ou seja, não mapeado no Win32 / Win64 API, mas construída diretamente sobre o sistema operacional syscall interface.

Veja também

Referências

Outras leituras

links externos