Может ли открытие объектов POSIX IPC в потоках привести к неопределенному поведению? - PullRequest
0 голосов
/ 28 октября 2019

Я использую семафоры для синхронизации доступа к общей памяти. У меня 16 сегментов общей памяти, 16 семафоров чтения и 16 семафоров записи. Процесс, который пишет в разделяемую память, отправляет задание в рабочий поток, и этот рабочий поток открывает разделяемую память и семафоры следующим образом:

if ((readsem = sem_open("/readsem_n", O_CREAT, 0666, 0)) == SEM_FAILED) {
  exit(EXIT_FAILURE);
}
if ((writesem = sem_open("/writesem_n", O_CREAT, 0666, 0)) == SEM_FAILED) {
  exit(EXIT_FAILURE);
}
if((shm_fd = shm_open("/shm_n", O_CREAT | O_RDWR, 0777)) == -1) {
  exit(EXIT_FAILURE);
}
if ((addr = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
  exit(EXIT_FAILURE);
}

Я не вызываю close () или sem_close () дляобъекты POSIX. Каждый раз, когда я хочу использовать их для синхронизации доступа на чтение и запись, я открываю их, не закрывая. Это работает первые несколько раз, но затем семафоры имеют некоторое значение мусора (2057840963, -1089400572), когда я вызываю sem_getvalue () для них, и программа вылетает с сообщением:

The futex facility returned an unexpected error code.Aborted (core dumped)

IПодозреваю, что я неправильно обращаюсь к семафору, и есть некоторая очистка, которую я не выполняю, когда использую семафоры в потоке. Это то, что называется неопределенным поведением? Должен ли я открывать эти объекты только один раз в начальном потоке процесса, а не несколько раз в потоке за потоком, когда используется соответствующий сегмент совместно используемой памяти?

...