Поддержка многопоточности в c11

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

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

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

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

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

  • Создание и управление потоками
  • мьютекса
  • Условные переменные
  • Тематическое хранилище &
  • Атомные объекты

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

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

Ответ 1

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

и ссылки в нем. Больше можно найти по адресу Открыть веб-сайт Std

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

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

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

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

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

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

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

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

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

Ответ 2

Относительно 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() раньше всех завершенных потоков.

Ответ 3

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

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

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

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

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