Возможно я неправильно понял вопрос, но преобразование от неподписанного символа до символа не является неуказанным, это является зависящим от реализации (4.7-3 в стандарте C++).
тип 1-байтового символа в C++ является "символом", не "неподписанным символом". Это дает реализациям немного больше свободы сделать лучшую вещь на платформе (например, организация по стандартизации, возможно, полагала, что там существуют центральные процессоры, где арифметика байта со знаком быстрее, чем неподписанная арифметика байта, хотя это - предположение с моей стороны). Также для совместимости с C. Результатом удаления этого вида экзистенциальной неуверенности от C++ является C#;-)
, Учитывая, что "символьный" тип существует, я думаю, что имеет смысл для обычных потоков использовать его даже при том, что его со знаком не определяется. Таким образом, возможно, на Ваш вопрос отвечает ответ на, "почему C++ только не определил символ, чтобы быть неподписанным?"
Если вам просто нужно предотвратить одновременную работу нескольких писателей с файлом, вы можете использовать метод File # flock
, чтобы запросить монопольную блокировку записи у каждого процесса:
fh = File.new("/some/file/path")
begin
fh.flock(File::LOCK_EX)
# ... write to the file here, or perform some other critical operation
ensure
fh.flock(File::LOCK_UN)
end
Примечание. Помещение вызова разблокировки в блок гарантирует, что
важен для предотвращения взаимоблокировки, если после блокировки файла возникает неперехваченное исключение.
Насколько мне известно, единственный способ сделать это в Подобная среда должна использовать семафор на основе файлов - прикоснитесь к файлу блокировки, выполните свою работу, удалите файл блокировки. Сделать процесс сбойным, если есть блокировка файла.
У вас также может быть служба, которая записывает в файл, который является многопоточным, и заставляет приложения взаимодействовать со службой для изменения файла, а не позволять им изменять файл напрямую .
Вы можете использовать планировщик фоновых заданий для выполнения самой работы, например delayed_job ( http://github.com/tobi/delayed_job ).