LINUX.ORG.RU

fork()'и и static variable


0

0

Здравствуйте,

Есть процесс с N потомками (созданных с помощью fork()). Каждому такому процессу нужно в определенный момент времени владеть ресурсом. Для того, что бы определять занят ресурс или свободен для "захвата" хочу использовать глобальную статическую переменную.

Вопрос: есть ли гарантия того, что операции "захвата", "освобождения" и проверка занятости ресурса будут атомарными, т.е. всегда один процесс сможет без проблем сделать что-то вроде такого?

if (!res_busy) { res_busy = 1; <do_smth>; res_busy = 0 }

Слышал про семафоры, но мне кажется, что они несколько complicated для моей задачи. Меня, как минимум, интересует переносимость Linux/BSD/Solaris.

Спасибо.

anonymous

> if (!res_busy) { res_busy = 1; <do_smth>; res_busy = 0 }

Так делать нельзя.

Подумай что получится, если случится переключение контекста между проверкой условия !res_busy и выполнением res_busy=1.

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

execve
()

fork() == процесс != нить те адресное пространство копируется любое изменение переменной (какой угодно) остальным "видно не будет", те в вашем случае только механизмы на уровне ядра

anonymous
()

Спасибо за разъяснения. Я не уточнил, что тем самым ресурсом является FILE* и запись в него (общий лог файл для нескольких процессов).

Насколько я понимаю, в данном случае fwrite() при FILE* открытом в "append mode" будет работать и без всяких необходимостей в блокировке разного вида "семафоров"?

Спасибо.

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

Хм, не помню точно - я использовал то ли write(), то ли fwrite() - проблем не было (на несколких тысячах процессов), но записи были не большие - несколько сот символов

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

write() в Линуксе на локальную ФС была атомарна. Весь буфер, хоть сотня мегабайт, пишется в конец файла (если append), процесс при этом в uninterruptable state. fwrite() работает с потоком (stream), поэтому во сколько системных вызовов write() преобразуется один вызов fwrite(), ИМХО, неизвестно.

Автору темы советую использовать, либо lock-файлы, либо блокировку файла lockf(), либо семафоры. Любое из этих решений не сложно, и гарантирует что fwrite() будет нормально дописывать в файл. Городить огород с созданием собственной реализации семафора/мутекса в разделяемой памяти смысла нет.

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

>Автору темы советую использовать, либо lock-файлы, либо блокировку файла lockf(), либо семафоры. Любое из этих решений не сложно, и гарантирует что fwrite() будет нормально дописывать в файл. Городить огород с созданием собственной реализации семафора/мутекса в разделяемой памяти смысла нет.

Лично я бы данному автору не советовал связыватся с чем-нибуть кроме файловых блокировок с stdlib а то он зароется во флюшах, буферах и компании...

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