Вопрос

Можно ли использовать системный вызов fcntl() для файла для синхронизации потоков/процессов (вместо семафорессы)?

Это было полезно?

Решение

Да.Блокировки fcntl Unix (и ресурсы файловой системы в целом) являются общесистемными, поэтому любые два потока выполнения (независимо от того, являются ли они отдельными процессами или нет) могут использовать их.Хорошая это идея или нет, зависит от контекста.

Другие советы

Это один из способов синхронизации между процессами, но если вы не хотите использовать семафоры, вы можете использовать общие мьютексы процессов, такие как мьютексы и условные переменные, созданные с помощью PTHREAD_PROCESS_SHARED атрибут на платформах на базе POSIX (см. pthread_mutexattr_setpshared() и pthread_condattr_setpshared()).Другой вариант — использовать механизм IPC на основе событий (сокеты и т. д.), который блокируется до тех пор, пока определенное вами событие не будет демультиплексировано (например,с помощью select()).Есть также несколько других вариантов на основе общей памяти.

Однако, поскольку вы используете C++, я бы рекомендовал использовать среду C++, которая значительно упрощает такого рода межпроцессную синхронизацию на нескольких платформах, например boost.interprocess или ТУЗ.

fcntl и flock предназначены не для потока, а для процесса, поэтому их нельзя использовать для синхронизации потоков.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top