LINUX.ORG.RU

ответ Стивенса на FAQ: «Почему не работают мьютексы расшаренные между процессами через шаренную память????»


0

0

Основной проблемой сдеся есть то что маны в линуксе не содержат никакой инфы на ету тему. Вся последующая инфа выдрана из Хидеров и Позикс.

cat /usr/include/unistd:
...
_POSIX_THREAD_PROCESS_SHARED Process-shared synchronization supported.
...

следственно
#include <unistd.h>
#ifdef _POSIX_THREAD_PROCESS_SHARED
//You code
int main(){
}
//End of You code
#else
#error "You system does not support Process-shared synchronization"
#endif

далее после создания и запихивания мютекса в шаренную память ему нужно установить свойсво "PTHREAD_PROCESS_SHARED" при помощи ф-и pthread_mutexattr_setpshared

после етого по словам Стивенса на posix-compatible системах всё должно работать.

несколько подсказок в тему:

extern int pthread_mutexattr_getpshared
extern int pthread_mutexattr_setpshared
extern int pthread_condattr_getpshared
extern int pthread_condattr_setpshared
extern int pthread_rwlockattr_getpshared
extern int pthread_rwlockattr_setpshared

★★★★★
Ответ на: комментарий от cvv

Пакет atp есть по умолчанию на altlinux и debian.

У Стивенса не всё нормально работает. Всё что у него на писано это "в общем". Конкретная реализация другое дело. Например, в книге Стивенса написано, что с помощью именованных POSIX семафоров можно синхронизировать процессы. В Линухе такого нет. В Линухе процессы синхронизируются семафорами SysV, а пототоки (нити, thread) синхронизируются POSIX семафорами (скорее всего в контексте одного процесса).

binr ★★
()
Ответ на: комментарий от binr

>Пакет atp есть по умолчанию на altlinux и debian.

никогда не юзал ни альт ни дебиан. Сейчас сижу на ЛФС ещё есть слака раньше были мандрака и редхат

>Всё что у него на писано это "в общем".

я читал две его книги так там были описаны особенности поведения большинства фич на нескольких юниксах(до десяти).

>Например, в книге Стивенса написано, что с помощью именованных POSIX семафоров можно синхронизировать процессы. В Линухе такого нет.

А они в линуксе вообще есть???

>В Линухе процессы синхронизируются семафорами SysV,

есть такое

>а пототоки (нити, thread) синхронизируются POSIX семафорами

>(скорее всего в контексте одного процесса).

я собственно и веду речь как расшарить семафор на несколько процессов. ибо по дефолту так оно и есь а на тему расшаривания между процессами доки молчат

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

С помощью POSIX семафоров в Линуксе можно синхронизировать потоки. Проверено, работает.

Для синхронизации процессов в разных процессах вызываешь ftok() с одним и тем же именем семафора. Либо кладёшь в расшаренный файл key_t, через который синхронизируются семафоры SysV. Вообще конечно лучше использовать БД, чем гемороиться с шаред мемори исемафорами SysV. Сам пока не пробовал, но уверен что так быстрее писать код и проще отлаживать :)

binr ★★
()
Ответ на: комментарий от binr

>С помощью POSIX семафоров в Линуксе можно синхронизировать потоки. Проверено, работает.

так и есть

>Для синхронизации процессов в разных процессах вызываешь ftok() с одним и тем же именем семафора. Либо кладёшь в расшаренный файл key_t, через который синхронизируются семафоры SysV.

ет мы давно проехали. но на семафорах SysV далеко не уедеш.

>Вообще конечно лучше использовать БД, чем гемороиться с шаред мемори исемафорами SysV.

и придёт к тебя дядюшка тормоз и племяничков позовёт ....

если тя нужно 100 транзакций в секунду то никакя БД тя не спасёт(Хотя Berckley может и вытянет).

>Сам пока не пробовал, но уверен что так быстрее писать код и проще отлаживать :)

Я оснановился на posix shm. там и синхронизацией всё нормально и работать удобно, и тормозит не сильно(в смысле сихронизация). А на SysV я забил ибо ето не юникс-вей

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

cvv:

> я собственно и веду речь как расшарить семафор на несколько процессов. ибо по дефолту так оно и есь а на тему расшаривания между процессами доки молчат

POSIX семафоры в Линуксе зачаточны.

Я пробовал их через шареную память для синхронизации между процессами использовать. Не получается: спящий процесс не просыпается. Как показала трассировка, он хочет rt сигнала, чтобы проснуться -- естественно, он его не дожидается.

Кроме того, Линуксовая реализация POSIX семафоров мне показалась _весьма_ тормознутой.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Синхронизация процессов через POSIX семафоры в Линуксе не возможна по умолчанию, только об этом почти ни где не написано :(

binr ★★
()
Ответ на: комментарий от cvv

Хорошо, допустим SQL тормознут по умолчанию. Но в конечном итоге какую программу проще отлаживать? Когда мы делаем обмен данными через шаред мемори мы по сути делаем свою БД. Зачем?

Есть такой вопрос, не пробовал ли кто-нибудь использовать SQLite? Как он по скорости? Априори кажется, что если БД хранить на файловой система tmpfs, то БД должна быть не очень тормозной.

binr ★★
()
Ответ на: комментарий от binr

Всёравно ты слишком много теряеш на гейтах в ядро раз в 10 больше чем на шаред мемори

cvv ★★★★★
() автор топика
Ответ на: комментарий от Die-Hard

>Не получается: спящий процесс не просыпается

Ты устанавливал на семафор флаг "PTHREAD_PROCESS_SHARED"????

иначе согласно POSIX он и НЕ ДОЛЖЕН проснутся.

cvv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.