Posix threads мы windows threads

Posix threads мы windows threads

Имеем Windows XP SP3. Но не суть, не вижу причин не запустить птриды и в Win7 и Win2000. Есть Visual Studio. Подключаются Posix Threads очень легко. Можно как и руками, а можно в GUI самой студии. Ниже краткая инструкция по употреблению.
Качаем сами птриды. тут

В моем случае птриды стоят тут «d:\Develop\libs\pthreads\»

Далее от сюда «d:\Develop\libs\pthreads\Pre-built.2\lib\» берем
«pthreadVSE2.dll» и копируем либо в сам проект, к exe’шникам. Либо, например, в windows\system32. Или добавить папку с dll’ками в path, но это не гибко.
Обратите внимание, dll’ки там разные. Под вин+студия нужна «pthreadVSE2.dll», что ясно из названия файликов 🙂

Далее открываем студию и создаем новый проект (или открываем готовый). Начнем с инклюда в код.

тут масса вариантов. Скопировтаь h файлы в свой проект или добавить папку с ними в path.
Мы делаем средствами самой студии. Идем в свойства проекта далее
-> Configuration Properties
-> C/C++
-> General
-> Добавляем путь «D:\Develop\libs\pthreads\Pre-built.2\include» в Additional Include Directories

Затем топаем в свойства линкера этого проекта.
-> Configuration Properties
-> Linker
-> General
-> Добавляем путь «D:\Develop\libs\pthreads\Pre-built.2\lib» в Additional Library Directories
Это мы сделали для того, чтобы компилятор знал где искать lib файл.
Сам файл можно добавить в исходники, например так:

А можно там же — в свойствах проекта.
-> Configuration Properties
-> Linker
-> General
-> Input
-> Additional Dependencies
-> Добавляем файл «pthreadVSE2.lib»
Имя файла, опять же, говорит само за себя.
Ну а ниже — краткий пример рабочего кода.

Posix threads мы windows threads

Профиль
Группа: Участник
Сообщений: 44
Регистрация: 6.2.2009

Репутация: нет
Всего: нет

И так в бою за титул чемпиона участвует два соперника
Win32Api(будем его так кликать):
OS: Windows NT/95/98/me/2000/xp/vista/seven/ce(может не в той последовательности)

POSIX:
OS: Unix/Linux(many)/Mac OS/QNX/(слышал про реализацию под Windows NT/95/98/me/2000/xp/vista/seven/ce правда уже не в комплекте).

Let’s Begin(Давайте начнем)

1)Round «Mutual blocking(взаимо блокировка)»:

Win32Api представляет CRITICAL_SECTION и и Mutex.
POSIX уверенно говорит о Mutex.

Win32Api:
CRITICAL_SECTION
InitializeCriticalSection();
EnterCriticalSection();
TryEnterCritticalSection();
LeaveCriticalSection();
DeleteCriticalSection();

Просты в использовании, выходят в режим ядра когда это действительно нужно. Из минусов можно сказать большой расход памяти(из-за структуры).
Требуют обработку исключений(по крайней мере InitializeCriticalSection,
а если я использую С, __try __catch __finally вообщем расклад то не очень)
-Распростроняются только на один процесс(хотя при желании можно и изменить, мы ведь знаем что в структуре есть handle семафора, но
наверное не стоит)
Mutex:
CreateMutex();
OpenMutex();
WaitForSingleObject();
WaitForMultiObjects();
ReleaseMutex();
CloseHandle();

Всегда используют ядро. Указатель на void наверное не самое лучшое решение, вдруг захочится узнать кто же все таки блокировал поток?
Но есть и приимущества указатель на void стандартная функция уничножения, и ожидания. Большим приимушеством будет что поток может ожидать
несколько mutex’s. Нет try lock . Так же плюс что является мульти процессорным.

Mutex:
pthread_mutex_init();
pthread_mutex_lock();
pthread_mutex_trylock();
pthread_mutex_unlock();
pthread_mutex_destroy();

Открытая структура, выходят в режим ядра когда это действительно нужно. Распростроняются только на один процесс. Нет возможности ожидания
больше одного mutexю
Кто победил? Трудновато сказать. Тут все завист от то кто что ожидает при использовании «Mutual blocking(взаимо блокировка)». Лично мое мнение это Win32Api.

так что счет 1:0

2)Round «Semaphore»:
Win32Api:
CreateSemaphore();
WaitForSingleObject();
WaitForMultiObjects();
ReleaseSemaphore();
CloseHandle();

В принципе все приимущества что и у Mutex. Не стоит думать как был создан(или же был открыт) семафор при уничтожении. Пожалуй не удобно при открытии
делать дубликацию HANDL.
Posix:
sem_init();
sem_wait();
sem_post();
sem_trywait();
sem_getvalue();
sem_destory();
sem_open();
sem_close();
sem_unlink();
Надо помнить как все же был создан(или был открыт) семафор при уничтожении. Приимучество можно получить счетчик, и есть try wait.

Думаю здесь честно победу можно отдать Win32Api.
Так что счет 2:0

3)Round «Atomic operation or Interlocked(Атомарные операции или Interlocked(мне не нравится перевод))»

Win32Api:
InterlockedDecrement();
InterlockedIncrement();
InterlockedAdd();
Ну и в таком духе.
Приимуществ нет. Не достаток вызывают DLL, соответственно заинлайнится не смогут(может есть какаета другая реализация?).

Posix(не слышал так что воспользуемся linux):
atomic_add();
atomic_sub();
atomic_inc();
atomic_dec();

Инлайнятся.
Говорить о assembler думаю не стоит, но если говорить то легче реализовывать под винду.
Раунд за Linux;
Так что счет 2:1.

4)Round «Thread local storage»

Win32Api:
TlsAlloc();
TlsSetValue();
TlsGetValue();
TlsFree();
Без коментариев.
Posix:
pthread_create_key();
pthread_setspecific();
pthread_getspecific();
pthread_delete_key();
Без коментариев.

В это раунде нечья.

Так что счет 3:2.

Win32Api:
InitializeConditionVariable();
SleepConditionVariableCS();
SleepConditionVariableSRW() — support only vista server 2008 не рассмотриваем.
WakeAllConditionVariable();
WakeConditionVariable();

Я бы сказал не чего особого. Только вот не понятно как уничтожать.
Posix:
pthread_cond_init()
pthread_cond_wait();
pthread_cond_timedwait();
pthread_cond_signal();
pthread_cond_broadcast();
pthread_cond_destroy();

Функция с ожиданием по времени.
Так что Posix +1;

Так что счет 3:3.

Win32Api не имеет барьеров. Создание управление потоками не лучше чем у POSIX, CreateThread/_beginthread/_beginthreadEx по мне менее удобны чем pthread_create,
Хотя бы по тому что параметров не надо столько передавать. Здесь я не писал о spin блокировках, read_write lock, в Win32Api это только в
vista/server2008. Стоит отметить OpenMP но это принадлежит visual studio.

Я не селен в многопоточности, просто по изучать хотелось, так что любые замечание по теме буду только рад.

0xDX
Дата 6.3.2009, 07:13 (ссылка) | (нет голосов) Загрузка .
Читайте также:  Посмотреть время загрузки linux
chaos
Дата 6.3.2009, 07:33 (ссылка) | (голосов:1) Загрузка .

Серийный программист

Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44

Цитата(0xDX @ 6.3.2009, 04:13)
Стоит отметить OpenMP но это принадлежит visual studio.

ЗЫ для чего вообще это сравнение? что оно дало?

Это сообщение отредактировал(а) chaos — 6.3.2009, 07:34

Эксперт

Профиль
Группа: Комодератор
Сообщений: 7037
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 60
Всего: 223

Уточнение — серия trylock для Win32 API есть — это WaitForSingleObject с 0 в качестве параметра timeout
По поводу void* в качестве handle для Win32API — это ГОРАЗДО лучше, чем открытая структура у пользователя. Система должна сама заботится о защите своих объектов от несанкционированного вмешательства пользователя (да и от санкционированного тоже)
Далее, все серия Interlocked* в Win32API инлайнится компилятором, никаких dll не нужно (конечно, если программист не приложит больших усилий, что бы этого не было )
В posix нет аналога Win32 Event’ов (очень убогий аналог — Conditional Variable)
В posix нет возможности ждать сразу на нескольких разных синхронизирующих примитивах.
По поводу TLS и там и там можно разложить переменные по TLS на этапе компиляции, и не пользоваться tls API совсем

Так что счет будет явно не в пользу posix.

xvr
Дата 6.3.2009, 14:42 (ссылка) | (нет голосов) Загрузка .
chaos
Дата 6.3.2009, 14:54 (ссылка) | (нет голосов) Загрузка .

Серийный программист

Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44

xvr, но хоть это не очень хорошо, но всеже все это можно реализовать» используя то что есть.

» — уже реализовано, например монжо поглядеть в ACE.
ACE_Event & ACE_AutoEvent
на счет ждать нескольких событий, если я не ошибасюь то ACE_Reactor решит проблему. Наверника что-то есть уже готовое в boost::thread — но точно не знаю, не пользуюсь

Это сообщение отредактировал(а) chaos — 6.3.2009, 14:57

Читайте также:  У меня неправильно установлен установщик windows
Lazin
Дата 6.3.2009, 15:30 (ссылка) | (нет голосов) Загрузка .

Эксперт

Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154

Цитата(0xDX @ 6.3.2009, 07:13 )
Хотя бы по тому что параметров не надо столько передавать. Здесь я не писал о spin блокировках, read_write lock, в Win32Api это только в
vista/server2008.

Эксперт

Профиль
Группа: Комодератор
Сообщений: 7037
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 60
Всего: 223

xvr
Дата 6.3.2009, 17:40 (ссылка) | (нет голосов) Загрузка .
Цитата(chaos @ 6.3.2009, 14:54)
xvr, но хоть это не очень хорошо, но всеже все это можно реализовать» используя то что есть.
Цитата
на счет ждать нескольких событий, если я не ошибасюь то ACE_Reactor решит проблему. Наверника что-то есть уже готовое в boost::thread — но точно не знаю, не пользуюсь

Профиль
Группа: Участник
Сообщений: 44
Регистрация: 6.2.2009

Репутация: нет
Всего: нет

0xDX
Дата 6.3.2009, 19:27 (ссылка) | (нет голосов) Загрузка .
Цитата
По поводу void* в качестве handle для Win32API — это ГОРАЗДО лучше, чем открытая структура у пользователя. Система должна сама заботится о защите своих объектов от несанкционированного вмешательства пользователя (да и от санкционированного тоже)

Спорный вопрос. Сколько *handle как проверить sizeof()? сколько я памяти использую?

Цитата
Далее, все серия Interlocked* в Win32API инлайнится компилятором, никаких dll не нужно (конечно, если программист не приложит больших усилий, что бы этого не было smile )

и как их сделать инлайн?

Цитата
В posix нет возможности ждать сразу на нескольких разных синхронизирующих примитивах.

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

Цитата
У Win32 это все же элегантнее — там можно ждать на самых разных событиях. Конечно это можно реализовать где угодно, но накладные расходы будут немаленькие smile
Читайте также:  Linux узнать путь до текущей папки

Эксперт

Профиль
Группа: Комодератор
Сообщений: 7037
Регистрация: 28.8.2007
Где: Химки, Московская обл

Репутация: 60
Всего: 223

xvr
Дата 6.3.2009, 20:27 (ссылка) | (нет голосов) Загрузка .
Цитата
По поводу void* в качестве handle для Win32API — это ГОРАЗДО лучше, чем открытая структура у пользователя. Система должна сама заботится о защите своих объектов от несанкционированного вмешательства пользователя (да и от санкционированного тоже)

Спорный вопрос. Сколько *handle как проверить sizeof()? сколько я памяти использую?

Цитата
Далее, все серия Interlocked* в Win32API инлайнится компилятором, никаких dll не нужно (конечно, если программист не приложит больших усилий, что бы этого не было smile )
Код
#pragma intrinsic(_InterlockedIncrement)
Цитата
У Win32 это все же элегантнее — там можно ждать на самых разных событиях. Конечно это можно реализовать где угодно, но накладные расходы будут немаленькие smile

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ 🙂
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе — для этого существует «Центр Помощи».
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »

[ Время генерации скрипта: 0.1241 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Оцените статью