POSIX Threads - POSIX Threads
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.h
cabeçalho e um fio biblioteca .
Há cerca de 100 linhas, todos os procedimentos prefixado pthread_
e eles podem ser categorizados em quatro grupos:
- gerenciamento de threads - a criação, juntando-se tópicos etc.
- mutexes
- variáveis de condição
- Sincronização entre threads usando leitura / bloqueios de escrita e barreiras
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
- sistema de execução
- OpenMP
- Cilk / cilk Além disso,
- Threading Building Blocks (TBB)
- Native POSIX Tópico Biblioteca (NPTL)
- DCEThreads
- clone (chamada de sistema Linux)
- ativação espúria
- armazenamento local de segmento
- GNU Threads portáteis
- FSU Pthreads
- O Grand Central Dispatch (biblioteca de threads da Apple)
- BeginThread (uma sub-rotina dentro do Windows para a criação de um novo segmento e linha unix)
- Threads estaduais , uma abordagem orientada evento para rosqueamento
Referências
Outras leituras
- David R. Butenhof (1997). Programação com POSIX Threads . Addison-Wesley. ISBN 978-0-201-63392-4.
- Bradford Nichols; Dick Buttlar; Jacqueline Proulx Farell (Setembro de 1996). Pthreads Programação . O'Reilly & Associates. ISBN 978-1-56592-115-3.
- Charles J. Northrup (1996/01/25). Programação com UNIX Threads . John Wiley & Sons. ISBN 978-0-471-13751-1.
- Kay A. Robbins & Steven Robbins (2003). Programação de Sistemas UNIX . Prentice-Hall. ISBN 978-0-13-042411-2.