Резьба в C, кросс-платформенный - PullRequest
12 голосов
/ 10 апреля 2011

Я имею дело с существующим проектом (в C), который в настоящее время выполняется в одном потоке, и мы хотели бы работать на нескольких платформах И иметь несколько потоков. Надеюсь, для этого есть библиотека, потому что, IMHO, Win32 API - это то же самое, что многократно тыкать в глаза. Я знаю о Boost.Thread для C ++, но это должен быть C (и скомпилированный на MinGW и gcc). Cygwin не вариант, извините.

Ответы [ 8 ]

9 голосов
/ 12 апреля 2011

Попробуйте OpenMP API, он мультиплатформенный, и вы можете скомпилировать его с GCC.

Краткое описание из Википедии :

OpenMP (Open Multi-Processing) - интерфейс прикладного программирования (API), который поддерживает многоплатформенную многопроцессорную совместную память программирование на C, C ++ и Fortran, [3] на большинстве платформ, процессор архитектуры и операционные системы, включая Solaris, AIX, HP-UX, Linux, macOS и Windows. Он состоит из набора компиляторов директивы, подпрограммы библиотеки и переменные среды, которые влияют поведение во время выполнения.

6 голосов
/ 10 апреля 2011

Я бы использовал API потока POSIX - pthread. В этой статье есть несколько советов по реализации этого в Windows и загрузка только с заголовочными файлами (лицензия BSD):

http://locklessinc.com/articles/pthreads_on_windows/

Edit: я использовал проект sourceforge pthreads-win32 в прошлом для многоплатформенных потоков, и он работал очень хорошо. С тех пор дела пошли дальше, и приведенная выше ссылка кажется более актуальной, хотя я этого не пробовал. Этот ответ предполагает, конечно, что pthread доступны для ваших целей, отличных от Windows (для Mac / Linux я думаю, что они, возможно, даже встроены)

4 голосов
/ 12 апреля 2011

Потоки Windows имеют достаточно разные функциональные возможности по сравнению с Linux, так что, возможно, вам следует рассмотреть две разные реализации, по крайней мере, если производительность приложения может быть проблемой. С другой стороны, простая реализация многопоточности может сделать ваше приложение медленнее, чем было раньше. Предположим, что производительность - это проблема, и многопоточность - лучший вариант.

В потоках Windows я специально думаю о портах завершения ввода-вывода (IOCP), которые позволяют реализовать потоки, управляемые событиями ввода-вывода, которые позволяют наиболее эффективно использовать оборудование.

Многие «классические» приложения построены по принципу «один поток / один сокет (/ один пользователь или аналогичный)», где количество одновременных сеансов будет ограничено способностью планировщика обрабатывать большое количество потоков (> 1000). Концепция IOCP позволяет ограничить количество потоков количеством ядер в вашей системе, что означает, что планировщику будет очень мало делать. Потоки будут выполняться только тогда, когда IOCP освободит их после того, как произошло событие ввода-вывода. Поток обслуживает IOC (обычно) инициирует новый ввод-вывод и возвращается для ожидания на IOCP следующего завершения. Перед освобождением потока IOCP также предоставит контекст завершения, так что поток "узнает", к какому контексту обработки принадлежит IOC.

Концепция IOCP полностью устраняет опрос, который является большой тратой ресурсов, хотя опрос "ожидание нескольких объектов" является своего рода улучшением. В прошлый раз, когда я посмотрел, в Linux не было ничего похожего на IOCP, поэтому многопоточное приложение для Linux было бы сконструировано совершенно иначе, чем приложение для Windows с IOCP.

В действительно эффективных приложениях IOCP существует риск того, что столько ресурсов ввода-вывода (или, скорее, выходов) будут поставлены в очередь на задействованный ресурс ввода-вывода, так что системе не хватает не выгружаемой памяти для их хранения. И наоборот, в действительно неэффективных приложениях IOCP существует риск того, что столько входов будет поставлено в очередь (ожидающих обслуживания), что при попытке их временной буферизации исчерпается не выгружаемая память.

2 голосов
/ 10 апреля 2011

glib threads могут быть скомпилированы кросс-платформенными.

1 голос
/ 13 июня 2016

Если кому-то нужно портативное и легкое решение для многопоточности в C, взгляните на библиотеку plibsys .Он обеспечивает управление потоками и синхронизацию, а также другие полезные функции, такие как реализация переносимых сокетов.Поддерживаются все основные операционные системы (Windows, Linux, OS X), также поддерживаются различные другие менее популярные операционные системы (например, AIX, HP-UX, Solaris, QNX, IRIX и т. Д.).На каждой платформе только собственные вызовы используются для минимизации накладных расходов.Библиотека полностью покрыта модульными тестами, которые регулярно проводятся.

1 голос
/ 10 апреля 2011

«Лучший» / «самый простой» / ... ответ здесь однозначно pthreads.Это нативная многопоточная архитектура в системах Unix / POSIX и почти так же хорошо работает в Windows.Больше не нужно искать.

1 голос
/ 10 апреля 2011

Учитывая, что вы ограничены C. У меня есть два предложения:

1) Я видел проект (похожий на ваш), который должен был работать в Windows и Linux с потоками.То, как это было написано, было то, что он (та же база кода) использовал pthreads в Linux и потоки win32 в Windows.Это было достигнуто условным оператором #ifdef везде, где необходимо было создать потоки, например

#ifdef WIN32

//use win32 threads

#else

//use pthreads

#endif

2) Вторым предложением может быть использование OpenMP.Вы когда-нибудь рассматривали OpenMP?

Пожалуйста, дайте мне знать, если я что-то пропустил или вы хотите узнать больше.Я рад помочь.

Лучший, Кришна

0 голосов
/ 20 апреля 2011

По моему опыту, многопоточность в C для Windows тесно связана с Win32 API. Другие языки, такие как C # и JAVA, поддерживаемые платформой, также связаны с этими базовыми библиотеками, предлагая свои классы потоков.

Однако я нашел платформу API openthreads на sourceforge, которая может вам помочь:

http://openthreads.sourceforge.net/

API моделируется в соответствии со стандартами потоков Java и POSIX,

Я сам не пробовал этого, поскольку в настоящее время у меня нет необходимости поддерживать несколько платформ в моих проектах C / C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...