Что такое posix win threads для Windows

Обновлено: 04.07.2024

Это приложение Windows под названием POSIX Threads for Windows, последнюю версию которого можно загрузить как pthreads4w-code-v3.0.0.zip. Его можно запустить онлайн на бесплатном хостинг-провайдере OnWorks для рабочих станций.

Загрузите и запустите онлайн это приложение под названием POSIX Threads для Windows с OnWorks бесплатно.

Следуйте этим инструкциям, чтобы запустить это приложение:

– 1. Загрузили это приложение на свой компьютер.

- 3. Загрузите это приложение в такой файловый менеджер.

- 4. Запустите любой онлайн-эмулятор OS OnWorks с этого веб-сайта, но лучше онлайн-эмулятор Windows.

– 6. Загрузите приложение и установите его.

- 7. Загрузите Wine из репозиториев программного обеспечения вашего дистрибутива Linux. После установки вы можете дважды щелкнуть приложение, чтобы запустить его с помощью Wine. Вы также можете попробовать PlayOnLinux, необычный интерфейс поверх Wine, который поможет вам установить популярные программы и игры для Windows.

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

Потоки POSIX для Windows

ОПИСАНИЕ:

Потоки POSIX для Windows, также известные как "pthreads-win32", реализуют большое подмножество связанных с потоками API из Единой спецификации Unix версии 3.

Соответствие и качество являются главными приоритетами этой зрелой библиотеки. Разработка началась в 1998 году и продолжилась благодаря многочисленным значительным профессиональным вкладам.

Обратите внимание: хотя PThreads4W может быть собран и запущен с его помощью, MinGW64 включает собственную библиотеку потоков POSIX по умолчанию, которая называется «winpthreads». Они несовместимы, и для сборки и запуска PThreads4W (ранее PThreads-WIn32) необходимо установить MinGW64 без win32pthreads. Если вы хотите или должны собрать и запустить с PThreads4W, вам нужно выбрать потоки win32 вместо POSIX при установке MinGW64, чтобы не устанавливать конфликтующие файлы включения и библиотеки winpthreads.

Я устанавливаю mingw-w64 в Windows, и есть два варианта: потоки win32 и потоки posix. Я знаю, в чем разница между потоками win32 и pthreads, но я не понимаю, в чем разница между этими двумя вариантами. Я сомневаюсь, что если я выберу потоки posix, это не позволит мне вызывать функции WinAPI, такие как CreateThread.

Кажется, этот параметр указывает, какой API потоков будет использоваться какой-либо программой или библиотекой, но какой? С помощью GCC, libstdc++ или чего-то еще?

Короче говоря, для этой версии mingw релиз threads-posix будет использовать posix API и разрешать использование std::thread, а threads-win32 будет использовать API win32 и отключит std. ::thread часть стандарта.

Хорошо, если я выберу потоки win32, то std::thread будет недоступен, но потоки win32 все равно будут использоваться. Но для чего?

@devnull, разве это не определяется API, который я буду использовать? Если я выберу версию MinGW для pthreads, что помешает мне использовать WinAPI для потоков?

4 ответа 4

GCC поставляется с библиотекой времени выполнения компилятора (libgcc), которую он использует (среди прочего) для обеспечения низкоуровневой абстракции ОС для функций, связанных с многопоточностью, на поддерживаемых им языках. Наиболее подходящим примером являются C++11 , , и libstdc++, которые не имеют полной реализации, когда GCC построен с его внутренней моделью потоков Win32. MinGW-w64 предоставляет winpthreads (реализация pthreads поверх API многопоточности Win32), которую GCC затем может связать, чтобы включить все необычные функции.

Я должен подчеркнуть, что эта опция не запрещает вам писать любой код, который вы хотите (она абсолютно НИКАК не влияет на то, какой API вы можете вызывать в своем коде). Он отражает только то, что библиотеки времени выполнения GCC (libgcc/libstdc++/. ) используют для своей функциональности. Предостережение, процитированное @James, не имеет ничего общего с моделью внутренней многопоточности GCC, а скорее с реализацией Microsoft CRT.

  • posix : включить функции многопоточности C++11/C11. Делает libgcc зависимым от libwinpthreads, поэтому, даже если вы не вызываете API pthreads напрямую, вы будете распространять DLL winpthreads. Нет ничего плохого в распространении еще одной DLL вместе с вашим приложением.
  • win32: функции многопоточности C++11 отсутствуют.

Ни то, ни другое не влияет на пользовательский код, вызывающий API Win32 или API pthreads. Вы всегда можете использовать оба варианта.

Библиотеки потоков POSIX представляют собой основанный на стандартах API потоков для C/C++. Это позволяет создать новый поток параллельных процессов. Он наиболее эффективен в многопроцессорных или многоядерных системах, где поток процессов можно запланировать для запуска на другом процессоре, что позволяет увеличить скорость за счет параллельной или распределенной обработки.Потоки требуют меньше накладных расходов, чем «разветвление» или порождение нового процесса, потому что система не инициализирует новое системное пространство виртуальной памяти и среду для процесса. Хотя это наиболее эффективно в многопроцессорной системе, выигрыш также наблюдается в однопроцессорных системах, которые используют задержку ввода-вывода и других системных функций, которые могут остановить выполнение процесса. (Один поток может выполняться, в то время как другой ожидает ввода-вывода или некоторой другой системной задержки.) Технологии параллельного программирования, такие как MPI и PVM, используются в распределенной вычислительной среде, в то время как потоки ограничены одной компьютерной системой. Все потоки внутри процесса используют одно и то же адресное пространство. Поток создается путем определения функции и ее аргументов, которые будут обрабатываться в потоке. Целью использования библиотеки потоков POSIX в вашем программном обеспечении является ускорение выполнения программного обеспечения.

  • Компилятор C: cc -lpthread pthread1.c
    или
  • Компилятор C++: g++ -lpthread pthread1.c

    В этом примере одна и та же функция используется в каждом потоке. Аргументы разные. Функции не обязательно должны быть одинаковыми.

  • поток — возвращает идентификатор потока. (беззнаковое длинное целое, определенное в bits/pthreadtypes.h)
  • attr — установите значение NULL, если используются атрибуты потока по умолчанию. (иначе определите члены структуры pthread_attr_t, определенной в bits/pthreadtypes.h) Атрибуты включают:
    • отсоединенное состояние (можно присоединиться? По умолчанию: PTHREAD_CREATE_JOINABLE. Другой вариант: PTHREAD_CREATE_DETACHED)
    • политика планирования (в режиме реального времени? PTHREAD_INHERIT_SCHED,PTHREAD_EXPLICIT_SCHED,SCHED_OTHER)
    • параметр планирования
    • унаследованный атрибут (по умолчанию: PTHREAD_EXPLICIT_SCHED Наследовать от родительского потока: PTHREAD_INHERIT_SCHED)
    • scope (Потоки ядра: PTHREAD_SCOPE_SYSTEM Потоки пользователя: PTHREAD_SCOPE_PROCESS Выберите один или другой, а не оба.)
    • размер защиты
    • адрес стека (см. unistd.h и bits/posix_opt.h _POSIX_THREAD_ATTR_STACKADDR)
    • размер стека (минимум PTHREAD_STACK_SIZE по умолчанию, установленный в pthread.h),

    Эта процедура убивает поток. Функция pthread_exit никогда не возвращается. Если поток не отсоединен, идентификатор потока и возвращаемое значение могут быть проверены из другого потока с помощью pthread_join.
    Примечание: указатель возврата *retval не должен иметь локальной области действия, иначе он перестанет существовать после завершения потока.

    Библиотека потоков предоставляет три механизма синхронизации:

    • мьютексы — блокировка взаимного исключения: блокирует доступ к переменным для других потоков. Это обеспечивает монопольный доступ потока к переменной или набору переменных.
    • joins — заставляет поток ждать, пока другие потоки не будут завершены (завершены).
    • условные переменные — тип данных pthread_cond_t

    Мьютексы:

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

    Пример многопоточной функции:

    Если операции загрузки и сохранения регистра для увеличения переменной counter происходят с неудачным временем, теоретически возможно, чтобы каждый поток увеличивал и перезаписывал одну и ту же переменную с одним и тем же значением. Другая возможность состоит в том, что второй поток сначала увеличит counter, блокируя первый поток до завершения, а затем первый поток увеличит его до 2.

    Листинг кода: mutex1.c

    Скомпилируйте: cc -lpthread mutex1.c
    Выполните: ./a.out
    Результаты:

    При попытке заблокировать мьютекс против мьютекса, удерживаемого другим потоком, этот поток блокируется до тех пор, пока мьютекс не будет разблокирован. Когда поток завершается, мьютекс не отключается, если он явно не разблокирован. По умолчанию ничего не происходит.

    Присоединяется:

    Соединение выполняется, когда нужно дождаться завершения потока. Процедура вызова потока может запустить несколько потоков, а затем дождаться их завершения, чтобы получить результаты. Один ждет завершения потоков с соединением.

    Пример кода: join1.c

    Скомпилировать: cc -lpthread join1.c
    Выполнить: ./a.out
    Результаты:

    Переменные условия:

    Переменная условия – это переменная типа pthread_cond_t, которая используется с соответствующими функциями для ожидания и последующего продолжения процесса. Механизм условных переменных позволяет потокам приостанавливать выполнение и освобождать процессор до тех пор, пока некоторое условие не станет истинным. Переменная условия всегда должна быть связана с мьютексом, чтобы избежать состояния гонки, созданного одним потоком, готовящимся к ожиданию, и другим потоком, который может сигнализировать об условии до того, как первый поток фактически ожидает его, что приводит к взаимоблокировке. Поток будет постоянно ожидать сигнала, который никогда не будет отправлен. Можно использовать любой мьютекс, между мьютексом и условной переменной нет явной связи.

    Функции, используемые в сочетании с условной переменной:

    • Создание/удаление:
    • pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

    Пример кода: cond1.c

    Скомпилировать: cc -lpthread cond1.c
    Выполнить: ./a.out
    Результаты:

    Обратите внимание, что функция functionCount1() была остановлена, пока значение count находилось между значениями COUNT_HALT1 и COUNT_HALT2. Единственное, что было гарантировано, это то, что functionCount2 будет увеличивать счетчик между значениями COUNT_HALT1 и COUNT_HALT2. Все остальное случайно.

    Логические условия (операторы "if" и "while") должны быть выбраны, чтобы гарантировать, что "сигнал" будет выполнен, если "ожидание" когда-либо будет обработано. Плохая программная логика также может привести к взаимоблокировке.

    Примечание. В этом примере изобилуют условия гонки, потому что в качестве условия используется count, и его нельзя заблокировать в инструкции while, не вызывая взаимной блокировки. Я буду работать над более чистым примером, но это пример условной переменной.

    Если этот параметр включен, каждый поток может иметь свои собственные параметры планирования. Атрибуты расписания могут быть указаны:

    • во время создания темы
    • динамически изменяя атрибуты уже созданной цепочки
    • путем определения влияния мьютекса на планирование потока при создании мьютекса
    • путем динамического изменения расписания потока во время операций синхронизации.

      Условия гонки: хотя код может отображаться на экране в том порядке, в котором вы хотите, чтобы код выполнялся, потоки планируются операционной системой и выполняются случайным образом. Нельзя предполагать, что потоки выполняются в порядке их создания. Они также могут выполняться с разной скоростью. Когда потоки выполняются (гонка за завершением), они могут давать неожиданные результаты (состояние гонки). Мьютексы и соединения должны использоваться для достижения предсказуемого порядка выполнения и результата.

    Порядок применения мьютекса также важен. Следующий сегмент кода иллюстрирует потенциальную взаимоблокировку:

    Если function1 получает первый мьютекс, а function2 — второй, все ресурсы связываются и блокируются.

      - зарегистрировать обработчики, которые будут вызываться во время fork(2) [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока [pthread_attr_init] - атрибуты создания потока - отмена потока [pthread_cleanup_push] - установить и удалить обработчики очистки [pthread_cleanup_push] - установить и удалить обработчики очистки - установить и удалить обработчики очистки [pthread_cleanup_push] - установить и удалить обработчики очистки [pthread_condattr_init] - атрибуты создания условия - атрибуты создания условия [pthread_cond_init] - операции над условиями [pthr ead_cond_init] - операции над условиями - операции над условиями [pthread_cond_init] - операции над условиями [pthread_cond_init] - операции над условиями [pthread_cond_init] - операции над условиями - создать новый поток - перевести работающий поток в состояние отсоединения - сравнить два идентификатора потока - завершить вызывающую нить [pthread_setschedparam] - управлять параметрами планирования нити [pthread_key_create] - управлять специфичными для нити данными - ждать завершения другой нити - управлять специфичными для нити данными [pthread_key_create] - управлять специфичными для нити данными - завершать все потоки в программе, кроме вызывающего потока [pthread_sigmask] - обработка сигналов в потоках [pthread_mutexattr_init] - атрибуты создания мьютекса [pthread_mutexattr_init] - атрибуты создания мьютекса - атрибуты создания мьютекса [pthread_mutexattr_init] - атрибуты создания мьютекса [pthread_mutex_init] - операции над мьютексами - операции над мьютексы [pthread_mutex_init] — операции над m utexes [pthread_mutex_init] - операции над мьютексами [pthread_mutex_init] - операции над мьютексами - однократная инициализация - возвращаемый идентификатор текущего потока [pthread_cancel] - отмена потока [pthread_cancel] - отмена потока - управление параметрами планирования потока [pthread_key_create] - управление потоком -специфические данные - обработка сигналов в потоках [pthread_cancel] - отмена потока
      - Paul Mazzucco - Andrae Muys - Не Linux, но хороший справочник. - семафоры, условные переменные - Обсуждение того, как работают потоки Linux
    • Независимые от платформы потоки:
        - Абстракция потока; включая мьютексы, условия и частные данные потока. [пример]
        - поддержка многопоточности, сокетов, доступа к файлам, демонов, постоянства, последовательного ввода-вывода, синтаксического анализа XML и системных служб - интерфейс C++
        • Руководство для программистов ACE: [pdf] (темы см. на стр. 29)
        • comp.programming.threads
        • comp.unix.solaris

        Охватывает представление ACE (ADAPTIVE Communication Environment) с открытым исходным кодом для потоков и других тем.

        Бесплатная подписка на главный ресурс для профессиональных программистов и разработчиков программного обеспечения. Многоязычный и мультиплатформенный со списками программ, советами по программированию, обсуждением проблем дизайна и алгоритмами. Подпишитесь здесь!

        Потоки можно использовать для реализации параллелизма. Для систем на базе UNIX стандартизированный интерфейс программирования потоков на языке C определен стандартом IEEE POSIX 1003.1c. Реализации, соответствующие этому стандарту, называются потоками POSIX или Pthreads.

        Windows не поддерживает pthreads напрямую, вместо этого проект Pthreads-w32 стремится предоставить переносимую реализацию оболочки с открытым исходным кодом.

        Первый шаг — получить проект pthread со следующего ftp-сайта:

        И извлеките его в любое место по вашему выбору:

        pthreads1

        Это будет место, где будут расположены зависимости вашего проекта и дополнительные файлы библиотеки.

        Чтобы продемонстрировать пример использования pthreads в среде Microsoft Visual Studio, сначала создайте новый пустой проект:

        pthreads2

        Добавьте исходный файл main.cpp в пустой проект и используйте следующий пример кода:

        Теперь установите зависимости проекта, указав, где искать включаемые файлы.

        Щелкните правой кнопкой мыши папку проекта и выберите "Свойства". В C/C++ > Общие > Дополнительные включаемые каталоги укажите расположение папки, в которой находятся включаемые потоки:

        pthreads3

        Затем нам нужно установить библиотеки. В свойствах проекта выберите Linker > General и задайте расположение файлов библиотеки pthread. Обязательно различайте 32- и 64-разрядные версии в зависимости от вашего ПК:

        pthreads4

        Наконец нам нужно установить дополнительные зависимости файла библиотеки. В свойствах проекта выберите Linker > Input > Additional Dependencies. Добавьте файлы pthreadVC2.lib и pthreadVCE2.lib:

        pthreads5

        Последний шаг — включение файла dll в проект. Узнайте, где находится pthreadVC2.dll:

        pthreads6

        Скопируйте этот файл отсюда и вставьте его туда, где находится ваш проект C++:

        Читайте также: