Резьба в C, кросс-платформенный

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

12 голосов | спросил Dhaivat Pandya 10 PMpSun, 10 Apr 2011 21:57:47 +040057Sunday 2011, 21:57:47

8 ответов


0

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

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

  

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

ответил Cacho Santa 12 PMpTue, 12 Apr 2011 19:38:09 +040038Tuesday 2011, 19:38:09
0

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

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

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

ответил paperjam 10 PMpSun, 10 Apr 2011 22:58:50 +040058Sunday 2011, 22:58:50
0

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

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

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

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

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

ответил Olof Forshell 12 PMpTue, 12 Apr 2011 19:22:09 +040022Tuesday 2011, 19:22:09
0

потоки glib можно скомпилировать на разных платформах.

ответил Manuel Salvadores 10 PMpSun, 10 Apr 2011 22:01:41 +040001Sunday 2011, 22:01:41
0

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

ответил rubenvb 10 PMpSun, 10 Apr 2011 22:59:40 +040059Sunday 2011, 22:59:40
0

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

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

#ifdef WIN32

//use win32 threads

#else

//use pthreads

#endif

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

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

Бест, Кришна

ответил Krishna 10 PMpSun, 10 Apr 2011 22:33:51 +040033Sunday 2011, 22:33:51
0

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

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

http://openthreads.sourceforge.net/

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

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

ответил Subbu 20 PMpWed, 20 Apr 2011 21:46:50 +040046Wednesday 2011, 21:46:50
0

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

ответил Alexander Saprykin 13 J0000006Europe/Moscow 2016, 15:34:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132