Являются ли _Thrd_create () и другие функции потоков реализации Visual Studio C функций Thrd_ C11? - PullRequest
1 голос
/ 11 февраля 2020

Visual Studio 2017 практически не поддерживает языки C99 и C11, однако в некоторых областях, похоже, имеются базовые примитивы, которые похожи, но с измененной версией имени примитива.

В частности, я смотрю на поддержка многопоточной библиотеки C11.

При просмотре во включаемом файле thr/xthreads.h выясняется, что большинство примитивов многопоточной библиотеки C11 доступны, однако имена функций начинаются с префикса подчеркивать. Другими словами thrd_create() - это _Thrd_create(), а включаемый файл threads.h не существует, но thr/xthreads.h существует.

Чтение этого сообщения в блоге от Херба Саттера от 2012/05/03, Reader Q & A: А как насчет VC ++ и C99? . Похоже, что у Microsoft было мало планов по внедрению C99 или C11 в Visual Studio, хотя другие фрагменты комментариев и вопросы по inte rnet указывают на то, что позиция могла измениться с 2012 года. .

Насколько вероятно продолжение поддержки многопоточности библиотеки, объявленной в файле включения thr/xthreads.h?

Какие у меня есть гарантии того, что эти примитивы будут поддерживаться в Visual Studio 2019 и позже? Есть ли какая-либо другая информация относительно планов Microsoft для Visual Studio?

Я собрал следующий простой пример в исходном файле с расширением. c после создания консольного приложения Windows в Visual Studio 2017. main() находится в исходном файле. cpp и состоит из вызова функции func() ниже:

#include <stdio.h>
#include <thr/xthreads.h>    //  access the underlying C11 threads library.

typedef struct {
    int ik;
    int ij;
    _Thrd_t *p;
} Thing;

int tx1 ( void * y)
{
    Thing * x = (Thing *)y;
    xtime xTimeAmt = {0};


    printf("One this is thread %d  %d\n", x->ik, x->ij);

    _Thrd_yield();

    xtime_get(&xTimeAmt, TIME_UTC);

    xTimeAmt.sec += 5;         // wait 5 seconds
    _Thrd_sleep(&xTimeAmt);

    printf("Two this is thread %d  %d\n", x->ik, x->ij);

    return 0;
}

_Thrd_t tt1;
_Thrd_t tt2;
_Thrd_t tt3;

int func(void)
{
    Thing t1 = { 1, 10 };
    Thing t2 = { 2, 20 };
    Thing t3 = { 3, 30 };
    int   rt1, rt2, rt3;

    for (int i = 3; i < 10; i++) {
        printf("i = %d\n", i);
    }

    _Thrd_create((t1.p = &tt1), tx1, &t1);
    _Thrd_create((t2.p = &tt2), tx1, &t2);
    _Thrd_create((t3.p = &tt3), tx1, &t3);

    _Thrd_join(tt1, &rt1);
    _Thrd_join(tt2, &rt2);
    _Thrd_join(tt3, &rt3);

    for (int i = 23; i < 30; i++) {
        printf("i = %d\n", i);
    }

    return 0;
}

Вывод этой программы:

i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
One this is thread 1  10
One this is thread 2  20
One this is thread 3  30
Two this is thread 1  10
Two this is thread 3  30
Two this is thread 2  20
i = 23
i = 24
i = 25
i = 26
i = 27
i = 28
i = 29
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...