Поддержка многопоточности в c11 - PullRequest
65 голосов
/ 16 января 2012

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

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

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

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

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

  • Создание потоков и управление ими
  • Mutex
  • Условные переменные
  • Хранение, специфичное для потоков &
  • Атомные объекты

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

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

Ответы [ 3 ]

52 голосов
/ 16 января 2012

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

и ссылки на них.Более подробную информацию можно найти по адресу Веб-сайт Open Std

Теперь к вашим вопросам:

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

Очевидный ответ заключается в том, что он был изменен с учетом нескольких потоков и их взаимодействия.Для более длинного ответа см. C ++ 11 представил стандартизированную модель памяти.Что это значит?И как это повлияет на программирование на C ++? , которое уже упоминалось в комментариях.Для более глубокого понимания ответ на стекопоток, возможно, не является правильным местом (тем более, вопрос с несколькими подвопросами!).Но, к счастью, Ханс Бём поддерживает очень хорошую страницу с интересными ссылками для дальнейшего чтения (опять же, имейте в виду, что модели памяти C11 и C ++ 11 семантически идентичны)

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

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

Поскольку теперь стандартная библиотека сама предоставляет (обеспечит) все функции, необходимые для многопоточности, в будущем не будет необходимости в 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, вероятно, будет примерно на том же уровне.

7 голосов
/ 02 мая 2012

Относительно 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;
}

EDIT : устранена проблема с общими данными потока и проблема выхода из main() раньше, чем завершатся все потоки.

2 голосов
/ 26 января 2012

Яннеб уже дал много объяснений.На ваши последние вопросы

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

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

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

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

...