2012-01-16 4 views
61

Новый стандарт C11 обеспечивает поддержку многопоточности.
Мои вопросы немного разнообразны, но определенно отвечают.
Я посмотрел на C11 n1570 черновик.
Он говорит:Многопоточная поддержка в c11

поддержка нескольких потоков выполнения включая секвенирование модель улучшилась память, атомные объекты и локальная память потока (<stdatomic.h> и <threads.h>)

Что такое Улучшения памяти модель последовательности? Как/Что изменяется от стандарта c99?

Вместо того, чтобы просто указывать стандарты, я буду признателен, если кто-то углубится в них и попытается объяснить семантику.

Как я понимаю, C11 обеспечивает поддержку:

  • создания резьбы и управления
  • Mutex
  • Условные переменные
  • Thread Specific хранения &
  • атомных объектов

Я прыгаю Я ничего не пропустил?
С тех пор, как стандартная библиотека сама предоставляет (обеспечит) все функции, необходимые для многопоточности, в будущем не понадобится POSIX и такие библиотеки (для поддержки Multi-Threading)?

И наконец, какие компиляторы обеспечивают поддержку вышеупомянутых функций? Есть ли какие-либо рекомендации относительно сроков, когда они будут поддерживаться?
Я помню, что для C++ 11 была ссылка на поддержку компилятора и функции, возможно, что-то в этом роде?

+0

См. Также: http://stackoverflow.com/questions/4938258/where-can-i-find-good-solid-documentation-for-the-c0x-synchronization-primiti – bdonlan

+18

@bdonlan: Вопрос о c11 а не C++ 11. Оба разные. Но ссылки, которые вы указали, для C++ 11, а не c11.duh? –

+3

Я закрываю голосование («точный дубликат»), потому что на ваш первый вопрос (о модели последовательности) уже был дан ответ. Трудно ответить на вопросы, которые содержат несколько вопросов, потому что кто-то может знать только часть вашего вопроса - поэтому их ответ никогда не может быть принят, потому что он не отвечает на весь вопрос и, возможно, никогда не будет принятого ответа. Пожалуйста, разделите свой вопрос и удалите точную дублируемую часть (или укажите, почему она отличается от вопросов, которые я связывал). – bdonlan

ответ

49

Во-первых, не списывайте C++ 11. Работа параллелизма для новых стандартов была выполнена под зонтиком C++ 11, а затем импортирована в C11 с явной целью быть совместимой. Хотя есть некоторые синтаксические различия (например, из-за того, что обычный C не имеет шаблонов или перегрузки функций), семантически они идентичны по дизайну. Для «доказательства» этого можно проверить документы РГ14. E.г:

и ссылки в них. Больше можно найти на Open Std Website

Теперь, на вопросы:

Что Улучшенная модель последовательности памяти?

Очевидным ответом является то, что он был изменен, чтобы учитывать несколько потоков и то, как они взаимодействуют. Несколько более длинный ответ см. В разделе C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?, о котором уже упоминалось в комментариях. Для глубокого понимания ответ на stackoverflow, возможно, не подходит (даже вопрос с несколькими подзапросами!). Но, к счастью, Hans Boehm maintains a very good page with interesting links for further reading (опять же, имейте в виду, что модели памяти C11 и C++ 11 семантически идентичны)

Надеюсь, я ничего не пропустил?

Вместе с моделью памяти ваш список, похоже, охватывает дополнения к параллелизму на C11. Для других изменений: wikipedia has a list; Я не могу придумать ничего, что пропустил список Википедии.

С тех пор, как стандартная библиотека сама предоставляет (обеспечит) все функции, необходимые для многопоточности, в будущем не понадобится POSIX и такие библиотеки (для поддержки многопоточности)?

Да, им будет необходимо. Во-первых, никто не собирается переписывать весь существующий код, который использует различные существующие API-интерфейсы потоков. Во-вторых, библиотека потоков C (++) 11/скорее всего будет реализована как обертка вокруг различных библиотек собственных потоков; черт, есть даже документированный способ получить указатель на основной поток, если вам нужно что-то сделать, кроме того, что поддерживает библиотека потоков C (++). Подумайте о библиотеке потоков C (++) 11, которая больше похожа на переносимую, наименее распространенную оболочку знаменателя вокруг различных библиотек собственных потоков.

И наконец, какие компиляторы обеспечивают поддержку вышеупомянутых функций? Есть ли какие-либо рекомендации относительно сроков, когда они будут поддерживаться? Я помню, что для C++ 11 была ссылка на поддержку компилятора и функции, возможно, что-то в этом роде?

Я не видел подробного списка, похоже, не так много шума вокруг C11 по сравнению с C++ 11. Для предстоящего GCC 4.7 есть короткое уведомление: http://gcc.gnu.org/gcc-4.7/changes.html. Для поддержки параллелизма можно проверить поддержку параллелизма на странице статуса C++ 11 здесь: http://gcc.gnu.org/projects/cxx0x.html. Также есть некоторые заметки о текущем статусе и планах GCC по адресу http://gcc.gnu.org/wiki/Atomic (согласно этой странице доступен stdatomic.h). Для других компиляторов здесь есть хороший список статуса C++ 11 для разных компиляторов http://www.aristeia.com/C++11/C++11FeatureAvailability.htm. Из ссылок там можно проверить статус поддержки параллелизма и предположить, что поставщик, о котором идет речь, планирует поддерживать C11, поддержка параллелизма C11, вероятно, будет примерно на том же уровне.

+0

Спасибо! Несколько комментариев, я не полностью убежден в том, что параллельный параллелизм в c11 вдохновлен или импортирован из C++ 11. Все заслуживающие доверия ссылки, которые говорят так, будут укреплять мою веру в его принятие. О необходимости библиотек POSIX & Multithreading в будущем, пользователь не должен беспокоиться о том, чтобы обеспечить их наличие, поскольку стандарт теперь предусматривает, что реализация должна иметь их на месте. Так что даже если стандартный lib api является просто оболочкой над родными libs, ответственность за реализацию несет пакет в отличие от before.Nice ссылки на поддержку компилятора. –

+0

@Als: Я добавил некоторые ссылки о наследии C++ работы параллелизма. Обратите внимание на то, что 1) это будет длительное время до тех пор, пока C11 не станет достаточно распространенным, и можно предположить, что он доступен 2) даже несмотря на то, что потоки и атомы являются необязательной частью стандарта, см., Например, макросы __STDC_NO_THREADS__ и __STDC_NO_ATOMICS__. При этом IMHO модель памяти является большим шагом вперед, поскольку она указывает, как компилятор должен вести wrt-доступ к памяти несколькими потоками, что помогает программам, использующим pthreads, так же, как и те, которые используют потоки C11. – janneb

+0

@Als: Добавлена ​​еще одна ссылка (n1349). Кроме того, извините за неудачу форматирования в предыдущем комментарии. – janneb

2

Janneb уже дал много объяснений. Для ваших последних вопросов

Наконец, какие компиляторы обеспечивают поддержку вышеупомянутых функций ? Есть ли ссылки на временные рамки, когда они будут поддерживаться ?

Семейство компиляторов gcc (clang, icc, opencc) поддерживает большую часть семантики, которую требует новый стандарт, существуют только синтаксические различия. (Лязг даже реализует в последней версии _Generic.)

Для P99 я написал wrapper macros, отображающее большинство функций к чему-то, что уже синтаксис C11, или приближается к ней (для эмуляции _Generic).

Так что если у вас есть один из этих компиляторов и находятся в системе POSIX, вы можете начать немедленно использовать много (большинство) C11: темы со всеми типами mtx_h и т.д., Атомикс с _Atomic, типа общих макросов (синтаксис немного отличается от C11), _Static_assert и материала выравнивания.

+1

«threads.h» - это imho, который будет частью библиотек C (например, glibc), а не только компилятором. Никакая текущая библиотека C и компилятор не имеют полной поддержки «истинного» многопоточности (в настоящее время и в ближайшем будущем с 02/2k12). – AoeAoe

+0

@AoeAoe, P99 также содержит полную эмуляцию части «threads.h» поверх потоков POSIX, включая 'mtx_t',' cond_t' и тому подобное. –

+0

спасибо, я посмотрю. – AoeAoe

8

От What compilers provide support for the above mentioned features?


Pelles C поддерживает C11 <threads.h>. Создание нитей с примером Pelles C компилятора:

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

РЕДАКТИРОВАТЬ: Устранено нить общей проблема данных и проблема выхода из main() раньше, чем все нити заканчиваются.