«Правильно» - это ценностное суждение, но (в отличие от других классов) есть большая выгода от того, что классы исключений являются монолитной иерархией, поэтому я бы вообще советовал выбрасывать что-то, полученное из std::exception
, , а не просто инт.
Во-вторых, остается открытым вопрос, является ли неправильное имя файла достаточно неожиданным, чтобы его можно было рассматривать как вескую причину для исключения вообще.
Что касается преимуществ по сравнению с утверждением if / else: есть пара. Во-первых, исключения позволяют отделить код, который работает с ошибками, поэтому основная идея и удобочитаемость кода не теряются в лабиринте обработки ошибок. Во-вторых, когда у вас есть несколько уровней кода между генерацией и перехватом исключения, код, который выдает исключение, может не знать, как его действительно нужно обрабатывать. Например, ваш код использует std::cout
для сообщения о проблеме, но большая часть такого кода будет сообщать об ошибках в std::cerr
. Вы можете перейти с одного на другой без каких-либо изменений в коде, который пытался открыть файл (который может быть глубоко в библиотеке, и не имеет ни малейшего представления о том, что следует использовать для этого приложения - и может использоваться в приложении где оба ошибаются, и MessageBox
было предпочтительным).
Разным ядрам разрешено не только читать из одного и того же блока памяти, но и записывать одновременно. «Безопасно» это или нет, это совсем другая история. Вам необходимо реализовать какую-то защиту в своем коде (обычно это делается с помощью семафоров или их производных), чтобы защитить себя от борьбы нескольких ядер за один и тот же блок памяти способом, который вы специально не допускаете.
О размере памяти, которую ядро читает за раз, обычно это значение регистра, 32 бита для 32-битного процессора, 64 бита для 64-битного процессора и так далее. Даже потоковая передача выполняется слово за словом (посмотрите, например, на memcpy).
О том, насколько на самом деле работают несколько ядер одновременно, каждое ядро использует одну шину для чтения и записи в память, поэтому доступ к любым ресурсам (оперативная память, внешние устройства, блок обработки с плавающей запятой) - это один запрос за раз, по одному ядру за раз. Однако фактическая обработка внутри ядра полностью параллельна. Передачи DMA также не блокируют шину, параллельные передачи ставятся в очередь и обрабатываются по очереди (я полагаю, не уверен на 100% в этом).
edit: просто для пояснения, в отличие от другого ответа здесь, я речь идет только о сценарии без кеширования. Конечно, если кэшируется память, доступ только для чтения будет полностью одновременным.
Я говорю только о сценарии без кеширования. Конечно, если кэшируется память, доступ только для чтения будет полностью одновременным. Я говорю только о сценарии без кеширования. Конечно, если память кэшируется, доступ только для чтения будет полностью параллельным.Если в вашем блоке размером 1 МБ действительно нет записей, то да, каждое ядро может читать из своей собственной строки кэша без каких-либо проблем, поскольку записи не выполняются и, следовательно, проблем с когерентностью кеша не возникает. 1286] В многоядерной архитектуре в основном имеется кэш для каждого ядра и «протокол согласования кэша», который делает недействительным кэш на некоторых ядрах, которые не имеют самой последней информации. Я думаю, что большинство процессоров реализуют протокол MOESI для согласованности кэша.
Согласованность кеша - сложная тема, которая широко обсуждалась (мне особенно нравятся некоторые статьи Джо Даффи здесь и и здесь ). Тем не менее, обсуждение вращается вокруг возможных потерь производительности кода, который, хотя и явно не блокируется, может замедлиться из-за того, что протокол согласованности кеш-памяти срабатывает для поддержания согласованности между кешами процессоров, но, пока нет записи, просто нет согласованности, которую нужно поддерживать, и, следовательно, не теряется в производительности.
Просто для пояснения, как сказано в комментарии нельзя получить доступ к ОЗУ одновременно, поскольку архитектуры x86 и x64 реализуют одну шину, которая совместно используется ядрами с SMP , что гарантирует равноправный доступ к основной памяти. Тем не менее, эта ситуация скрывается кеш-памятью каждого ядра, что позволяет каждому ядру иметь свою собственную копию данных. Для 1 МБ данных может возникнуть конкуренция, пока ядро обновляет свой кеш, но это будет незначительно.
Некоторые полезные ссылки: