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