Потоки C11 в Windows

Я создаю кроссплатформенное программное обеспечение в Visual Studio 2012 Express для Windows. По понятным причинам я не могу использовать .NET System::Threading::Thread. Я надеялся, что смогу использовать новые функции многопоточности C11 (threads.h, а не pthread.h) при использовании VS2012, поскольку я создал абстрактную структуру на основе форм .NET. Я начинаю верить, что это невозможно для Windows. У кого-нибудь есть идея. Я буду использовать библиотеки C++ (boost и std), только если это мои единственные варианты.

Есть кто знает что делать?


person JMRC    schedule 28.02.2013    source источник
comment
Visual Studio обычно не поддерживает C, за исключением тех функций, которые он разделяет с C++. И я не думаю, что они планируют поддерживать его в ближайшее время, если вообще когда-либо.   -  person Benjamin Lindley    schedule 28.02.2013
comment
Насколько я знаю, библиотека потоков C11 не реализована в MSVC. (У них все еще есть способ добиться соответствия C99.) Поскольку вы используете VS2012, вам гораздо больше повезет с библиотека потоков C++11, которая доступна для вас.   -  person Sean Cline    schedule 28.02.2013
comment
Возможно Вы правы.   -  person JMRC    schedule 28.02.2013


Ответы (3)


Visual Studio 2012 не поддерживает многопоточность C11 (Microsoft неоднократно заявляла, что мало заинтересована в обновлении C, предпочитая сосредоточиться на C++), но поддерживает std::thread и связанные с ним средства. Если вы пишете на C++, возможно, вам все равно следует использовать их вместо библиотек потоков C.

person Matt Kline    schedule 28.02.2013
comment
+1 за то, что заметил, что OP упомянул C11, а не C++11. я бы ответил так, как если бы ОП ошибался в отношении поддержки потоков C++ 11 в Visual C++... - person Cheers and hth. - Alf; 28.02.2013
comment
Спасибо, причина, по которой я предпочитаю C11, заключается в будущей совместимости с C, если я когда-нибудь решу увеличить производительность. Но у std действительно есть много преимуществ. - person JMRC; 28.02.2013
comment
будущая совместимость с C, если я когда-нибудь решу увеличить производительность ... А? Хорошо написанный C++ может быть столь же производительным, как и C. Сравнение C и C++ не связано с производительностью (по крайней мере, не с современными компиляторами), а связано со стилем программирования и методологиями. - person Matt Kline; 28.02.2013
comment
Разница между C и C++ действительно очень мала в наши дни, но ООП и универсальное программирование не могут идти в ногу с процедурным. Но вы правы насчет методологии. На самом деле мне не нравится, что (например) более низкоуровневые приложения написаны на таких языках, как Java и HTML5/Javascript. Сначала вы должны сделать то, что у вас есть, как можно лучше, прежде чем зависеть от внешних факторов (более быстрый процессор). Это только скрывает более низкое качество кодирования. Но я предполагаю, что это - то, куда мы направляемся. - person JMRC; 28.02.2013
comment
C++ может быть даже быстрее, чем C, и создавать двоичные файлы меньшего размера, если они правильно написаны. Сегодня нет такой вещи, чтобы программы в стиле ÖOP работали медленнее. Вероятно, это было проблемой в начале, когда C++ был надстройкой над C, но в 2016 году это уже не актуально. ООП и универсальное программирование не могут идти в ногу с процедурным - ложное утверждение. - person ingframin; 05.04.2016

Visual Studio 2017 содержит заголовок xthreads.h, который очень похож, но немного отличается от threads.h. Например:

из https://en.cppreference.com/w/c/thread/thrd_sleep

#include <threads.h>
#include <time.h>
#include <stdio.h>

int main(void)
{
    printf("Time: %s", ctime(&(time_t){time(NULL)}));
    thrd_sleep(&(struct timespec){.tv_sec=1}, NULL); // sleep 1 sec
    printf("Time: %s", ctime(&(time_t){time(NULL)}));
}

Было бы

#include <thr/xthreads.h>
#include <time.h>
#include <stdio.h>

int main(void)
{
    struct xtime stoptime;
    xtime_get( &stoptime, 1);
    stoptime.sec += 1;
    printf("Time: %s", ctime(&(time_t){time(NULL)}));
    _Thrd_sleep( &stoptime ); 
    printf("Time: %s", ctime(&(time_t){time(NULL)}));
}

* ПРИМЕЧАНИЕ: xthreads.h НЕ ЯВЛЯЕТСЯ стандартным и поэтому может быть изменен. *

Существует также библиотека эмуляции по адресу https://gist.github.com/yohhoy/2223710.

person annoying_squid    schedule 20.02.2019
comment
Этот заголовочный файл ‹thr/xthreads.h› не документирован и, следовательно, подвержен несовместимым изменениям. Например, см. сообщество разработчиков. visualstudio.com/content/problem/413586/ - person Bruno Haible; 20.06.2019
comment
Спасибо, я добавил NOTE, чтобы другие знали. - person annoying_squid; 20.06.2019

Интерфейс потоков C11 был в основном скопирован с интерфейса потоков Dikumware в их проприетарной библиотеке потоков. AFAIR их материал работает на разных платформах, и они создали этот интерфейс как пересечение функций потоков Windows и потоков POSIX.

Я не знаю, есть ли у них это сейчас как «официальная» библиотека потоков C11, но это не должно быть далеко от этого.

person Jens Gustedt    schedule 28.02.2013