проверка безопасности fork () - PullRequest
3 голосов
/ 06 декабря 2010
Поведение

fork () не определено, если в процессе несколько потоков. Как я могу проверить, что существует только один поток (в первую очередь на linux, но также интересны windows, darwin)?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

В Linux поведение fork () не является неопределенным в многопоточном процессе, но оно выполняет вещи, которые обычно не очень полезны.

Вернее, если вы используете fork () и ненемедленно вызовите exec (), вы рискуете получить утечку неуказанных ресурсов, возможно, включая блокировки, которые могут вызвать взаимоблокировку.

Конечно, можно спросить Linux (через procfs), сколько потоков в текущей группе потоков.Если ответ один, это означает, что процесс является однопоточным.

2 голосов
/ 06 декабря 2010

Это невозможно сделать. С pthreads вы можете использовать функцию pthread_is_multithreaded_np(), но это сделает ваш код fork() зависимым от pthreads, и это не работает на всех платформах. И нет никакого способа сделать проверку независимо от библиотеки потоков.

Если это приложение, просто не используйте потоки и разветвление одновременно. Если вы создаете многопоточную программу, никогда не вызывайте fork() (за исключением комбинаций fork / execv).

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

В качестве альтернативы для приложения вы можете попробовать использовать pthread_atfork(...), чтобы убедиться, что будет безопасно вызывать fork().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...