Является ли flock(fd, LOCK_UN) неопределенным, когда блокировка уже разблокирована?

Справочные страницы ( https://linux.die.net/man/2/flock ) неясно, разрешена ли операция LOCK_UN для flock(), если разблокировка уже была вызвана в другом потоке. В моем случае несколько потоков могут читать один и тот же файл через несколько файловых дескрипторов, каждый из которых будет вызывать flock(fd, LOCK_SH), а затем flock(fd, LOCK_UN) после чтения. Приведет ли это к неопределенному поведению?

Например:

//Two duplicate threads do:
FILE* fp = fopen("path", "r");
if (fp) {
    int fd = fileno(fp); // there is much more complexity in-between that makes fopen easier to use
    flock(fd, LOCK_SH);
    my_read_function(fp); // does something with a global (not the case in actual code)
    fclose(fp); // apparently the file might already be unlocked here if only this thread has opened it, but assume that I may use C++ to create some safer wrapper to handle exceptions and decide to use explicit flock calls outside the destructor
    flock(fd, LOCK_UN);
}

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

Заранее спасибо.


person synchronizer    schedule 01.05.2017    source источник
comment
Если гарантируется, что все потоки только читают файл, блокировка не требуется.   -  person alk    schedule 01.05.2017
comment
Связано (для записи): stackoverflow.com/q/9462532/694576   -  person alk    schedule 01.05.2017
comment
Я думаю, что идея заключалась в том, что кто-то в другом процессе может случайно попытаться записать файл где-то еще в программе, и в этом случае блокировка будет безопаснее. Основываясь на вышеизложенном, кажется, что flock() бесполезен для потоков в одном и том же процессе. Это правильно? Кроме того, меня все еще интересует поведение разблокировки несколько раз.   -  person synchronizer    schedule 01.05.2017