2012-01-16 17 views
61

Il nuovo standard C11 offre un supporto per Multi-Threading.
Le mie domande sono un po 'diversificate ma sicuramente rispondenti.
ho avuto uno sguardo al progetto C11 n1570.
Si dice:Supporto Multi-Threading in C11

supporto per più thread di esecuzione compreso un sequenziamento modello migliorato la memoria, oggetti atomici e stoccaggio filo-locale (<stdatomic.h> e <threads.h>)

Qual è la memoria migliorata modello di sequenziamento? Come/Cosa cambia dallo standard c99?

Piuttosto che solo citazioni da serie, io sarò grato se qualcuno scava più in profondità in loro e cerca spiegare la semantica coinvolti.

quanto ho capito, C11 fornisce il supporto per:

  • creazione e la gestione dei thread
  • Mutex
  • Variabili condizionali
  • Discussione archiviazione specifico &
  • atomica Oggetti

salto e non mi sono perso niente?
Da oggi la stessa libreria Standard fornisce (fornirà) tutte le funzionalità necessarie per il multi-threading, non ci sarebbe bisogno di POSIX e di tali librerie (per il supporto Multi-Threading) in futuro?

Infine, cosa compilatori forniscono il supporto per le caratteristiche di cui sopra? Ci sono riferimenti alle scadenze quando questi saranno supportati?
Mi ricordo per C++ 11 c'era un collegamento per il supporto del compilatore e funzionalità, forse qualcosa del genere?

+0

Vedere anche: http://stackoverflow.com/questions/4938258/where-can-i-find-good-solid-documentation-for-the-c0x-synchronization-primiti – bdonlan

+18

@bdonlan: la domanda riguarda il c11 e non C++ 11. Entrambi sono diversi. Entrambi i collegamenti forniti sono per C++ 11 e non c11.duh? –

+3

Sto votando vicino ('duplicato esatto') perché la tua prima domanda (sul modello di sequenziamento) ha già avuto risposta. È difficile rispondere a domande che contengono più domande, perché qualcuno può solo conoscere una parte della tua domanda - la loro risposta non può quindi essere accettata, perché non risponde all'intera domanda e non ci può mai essere una risposta accettata. Si prega di dividere la domanda e rimuovere la parte duplicata esatta (o indicare perché è diversa dalle domande che ho collegato). – bdonlan

risposta

49

In primo luogo, non scrivere off C++ 11. Il lavoro di concorrenza per i nuovi standard è stato fatto sotto l'ombrello C++ 11, quindi importato in C11 con l'obiettivo esplicito di essere compatibile. Mentre ci sono alcune differenze sintattiche (ad esempio a causa della semplice C che non ha modelli o sovraccarico di funzioni), semanticamente sono identiche per design. Per "prove" di questo, è possibile controllare i documenti del WG14. E.g:

e riferimenti ivi. Più può essere trovato alla Open Std Website

Ora, alle tue domande:

Qual è il modello di sequenziamento di memoria migliorato?

La risposta ovvia è che è stato modificato per tenere conto di più thread e di come interagiscono. Per una risposta leggermente più lunga, vedere C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming? già menzionato nei commenti. Per una comprensione approfondita, una risposta StackOverflow non è forse il posto giusto (anche meno una domanda con diverse sottoquestioni!). Ma per fortuna Hans Boehm maintains a very good page with interesting links for further reading (ancora una volta, tenere a mente che il C++ 11 modelli di memoria C11 e sono semanticamente identico)

spero non mi manca qualcosa?

Insieme al modello di memoria, l'elenco sembra coprire le aggiunte di concorrenza in C11. Per altre modifiche, wikipedia has a list; in cima alla mia testa non riesco a trovare nulla che la lista di wikipedia abbia mancato.

Da oggi la libreria standard offre di per sé (fornirà) tutte le funzionalità necessarie per Multi-Threading, non ci sarebbe alcun bisogno di POSIX e tali librerie (per il supporto Multi-Threading) in futuro?

Sì, ce ne sarà bisogno. Innanzitutto, nessuno sta riscrivendo tutto il codice esistente che utilizza le varie API di thread esistenti. In secondo luogo, la libreria di thread C (++) 11 sarà/sarà probabilmente implementata come wrapper attorno alle varie librerie di thread nativi; diamine, c'è anche un modo documentato per recuperare un puntatore al thread nativo sottostante, nel caso in cui si debba fare qualcosa oltre a ciò che la libreria di thread C (++) supporta. Pensa alla libreria di thread C (++) 11 più simile a un wrapper portatile, meno comune denominatore attorno alle varie librerie di thread nativi.

Infine, quali compilatori forniscono supporto per le funzioni sopra menzionate? Ci sono riferimenti alle scadenze quando questi saranno supportati? Ricordo per C++ 11 c'era un link per il supporto del compilatore e funzionalità, forse qualcosa di simile?

Non ho visto alcun elenco dettagliato, non sembra esserci più tanto ronzio attorno a C11 rispetto a C++ 11. C'è un breve avviso per il prossimo GCC 4.7 qui: http://gcc.gnu.org/gcc-4.7/changes.html. Per il supporto della concorrenza, è possibile controllare il supporto per la concorrenza nella pagina di stato C++ 11 qui: http://gcc.gnu.org/projects/cxx0x.html. Ci sono anche alcune note sullo stato corrente e i piani per GCC a http://gcc.gnu.org/wiki/Atomic (in base a quella pagina, stdatomic.h è disponibile). Per altri compilatori, c'è una bella lista dello stato di C++ 11 per vari compilatori qui http://www.aristeia.com/C++11/C++11FeatureAvailability.htm. Da questi collegamenti è possibile verificare lo stato del supporto della concorrenza e, supponendo che il fornitore in questione pianifichi di supportare C11, è probabile che il supporto della concorrenza C11 si trovi all'incirca allo stesso livello.

+0

Grazie! Alcuni commenti, non sono del tutto convinto dall'argomentazione che la concorrenza in c11 è ispirata o importata dal C++ 11. Qualsiasi riferimento credibile che dica si accrescerà la mia fiducia nell'accettarlo. A proposito di librerie POSIX e multithreading in futuro, un utente non dovrà preoccuparsi di garantire che siano in atto perché lo standard ora impone che un'implementazione debba averli in posizione. Quindi, anche se le lib api standard sono solo wrapper su librerie native, è responsabilità dell'implementazione fornire l'intero pacchetto diverso da prima. Comunque, i collegamenti sul supporto del compilatore. –

+0

@Als: ho aggiunto alcuni collegamenti sull'eredità C++ del lavoro di concorrenza. Scrivi il tuo secondo punto, tieni presente che 1) sarà molto tempo prima che C11 sia abbastanza comune da poter supporre che sia disponibile 2) anche così, i thread e l'atomica sono una parte facoltativa dello standard, vedi per es. i macro __STDC_NO_THREADS__ e __STDC_NO_ATOMICS__. Detto questo, IMHO il modello di memoria è un grande passo in avanti in quanto specifica come il compilatore dovrebbe comportarsi per gli accessi alla memoria da più thread, il che aiuta i programmi che utilizzano pthreads proprio come quelli che usano i thread C11. – janneb

+0

@Als: aggiunto un altro collegamento (n1349). Inoltre, mi dispiace per la formattazione fallita nel commento precedente. – janneb

2

Janneb ha già fornito molte spiegazioni. Per le tue ultime domande

Infine, cosa compilatori forniscono il supporto per i suddetti caratteristiche? Ci sono riferimenti alle scadenze quando questi saranno supportati da ?

La famiglia di compilatori gcc (clang, icc, opencc) supporta la maggior parte della semantica richiesta dal nuovo standard, ci sono solo differenze sintattiche. (Clang implementa anche _Generic nella sua ultima versione.)

Per P99 ho scritto wrapper macros che mappa la maggior parte delle funzioni a qualcosa che è già la sintassi C11, o si avvicina ad esso (per emulare _Generic).

Quindi, se si dispone di uno di questi compilatori e siete su un sistema POSIX, è possibile iniziare a utilizzare un sacco (la maggior parte) di C11 subito: le discussioni con tutti i tipi mtx_h ecc, Atomics con _Atomic, tipo macro generici (la sintassi è leggermente diversa da C11), _Static_assert e gli elementi di allineamento.

+1

"threads.h" sta diventando parte delle librerie C (come glibc) e non solo del compilatore. Nessuna libreria e compilatore C corrente ha pieno supporto per il multithreading "vero" (per ora e prossimo futuro a partire da 02/2k12). – AoeAoe

+0

@AoeAoe, P99 contiene anche un'emulazione completa della parte "threads.h" in cima ai thread POSIX, inclusi 'mtx_t',' cond_t' e cose del genere. –

+0

grazie, lo esaminerò. – AoeAoe

8

Riguardo a What compilers provide support for the above mentioned features?


Pelles C supporta C11 <threads.h>. Creazione di filettature con esempio Pelles C compilatore:

#include <stdio.h> 
#include <threads.h> 

#define NUM_THREADS 7 

static int threadData[NUM_THREADS]; 

int threadFunction(void * data) { 
    printf("%d-th thread up\n", *(int*)data); 
    return 0; 
} 

int main(void) { 
    thrd_t threadId[NUM_THREADS]; 

    // init thread data 
    for (int i=0; i < NUM_THREADS; ++i) 
     threadData[i] = i; 

    // start NUM_THREADS amount of threads 
    for (int i=0; i < NUM_THREADS; ++i) { 
     if (thrd_create(threadId+i, threadFunction, threadData+i) != thrd_success) { 
      printf("%d-th thread create error\n", i); 
      return 0; 
     } 
    } 

    // wait until all threads terminates 
    for (int i=0; i < NUM_THREADS; ++i) 
     thrd_join(threadId[i], NULL); 

    return 0; 
} 

EDIT: Eliminato problema di dati filo problema comune e di uscire dal main() prima di tutte le discussioni termina.