Intereting Posts
Должен ли я публиковать исходный код ядра, если я выпускаю собственное ядро? Катить все файлы в папке, включая имя файла, используя цикл for? Настольное приложение, запускаемое пользователем администратора (но не явно с sudo), принимает права собственности на файл общего доступа Ожидайте, чтобы скрипт автоматически регистрировался, командовал и показывал свой вывод Окно Xorg / Twm фокусируется только на мыши Что такое / dev / disk / by-uuid / и почему он использует все свободное пространство на диске Использование autofs для установки общего ресурса NFS Устройство чтения SD-карт в Linux: протокол SPI или SD под Как это так, что отсутствующие 0s автоматически добавляются в IP-адреса? (`ping 10.5` эквивалентно` ping 10.0.0.5`) измеритель скорости трубы с машиносчитываемым выходом Какой светлый дистрибутив Linux позволяет подключаться через RDP с экрана входа в систему Почему AltGr переименовывается из кода 108 в код 92 (LVL3) и где? Файлы без расширения .sh, не считающиеся для автозаполнения в zsh Как мне вернуться в Главное меню в YUMI после перехода на «boot:» Показывать заголовки столбцов командой «ls»

Взаимное исключение между всеми streamами и процессами Linux

Я пытаюсь написать кусок кода, который не должен выполняться одновременно ни streamами одного и того же процесса, ни разными процессами. Другими словами, мне нужен механизм глобальной синхронизации, гарантирующий абсолютное взаимное исключение в GNU / Linux.

Какие страtagsи я пробовал до сих пор:

  1. Простые мьютексы ( std::mutex , pthread мьютексы и т. Д.). Проблема заключается в том, что эти примитивы обеспечивают синхронизацию только между streamами внутри одного процесса, а не разными.
  2. Файловые блокировки ( lockf , fcntl ). По словам мужчины, они обеспечивают блокировку между различными процессами, но streamи одного процесса наследуют блокировку и не могут синхронизироваться. Во всяком случае, я пытался, это не помогло мне.
  3. POSIX уровня ядра назвал семафоры ( sem_open , sem_wait , sem_post ), используя их со значением init 1 в качестве мьютексов. Кажется, что оба случая были успешно синхронизированы, но проблема в том, что если процесс был остановлен во время удержания семафора, сам семафор все еще остается живым, потому что имеет постоянство ядра. В результате, когда процесс перезапускается, он ждет sem навсегда.
  4. Я прочитал о блокировках Open file description ( F_OFD_SETLK …) с моей последней попытки. Кажется, они могли бы помочь мне (я не совсем понял). Но они доступны начиная с ядра v.3.15, и мне нужно собрать исходники для ядра v. 3.10.
  5. Также я попытался объединить простые взаимные исключения, чтобы получить синхронизацию для каждого streamа с блокировками файлов для достижения синхронизации для каждого процесса. По неизвестным причинам – он не работает (никаких тупиков или чего-то подобного не произошло – он просто не может синхронизировать его полностью, и кажется, что код выполняется одновременно).

Таким образом, вопрос – какой подход будет актуальным для этой задачи? Стоит ли пытаться комбинировать разные комбинации разных примитивов или использовать какие-то другие – я застрял и понятия не имею, что делать дальше.

PS Причина, по которой я не опубликовал ни одного примера кода, здесь не имеет никакого смысла (а также из-за NDA). В двух словах – это ошибка (вызывающая SIGSEGV) в большом продукте, который включает в себя несколько streamов и процессов, часто вызывающих некоторые методы среды выполнения CUDA одновременно.

Да, это абсолютно связанная с CUDA проблема, но мы обнаружили, что ограничение параллельного выполнения может быть временным решением. Как я уже сказал, проблема заключается в организации глобального и безопасного взаимного исключения для streamов и процессов.