Я хотел знать, что происходит, когда три потока в одном приложении вызывают статический метод из DLL (почти) одновременно. Существуют ли 3 экземпляра DLL, загружаемых для каждого потока, или другие потоки получают доступ к DLL только после того, как первый поток выполняется с помощью статического метода DLL (например, каждый поток получает доступ к dll после его поворота?Что произойдет, если несколько потоков в одном приложении вызовут одну DLL
ответ
Есть ли 3 экземпляра загруженной DLL, по одной для каждой темы?
Количество DLL - обычно загружается один раз в процессе. (Есть некоторые тонкие вопросы здесь, возможно для того же сборка будет загружаться в два раза, если вы используете Load
и LoadFrom
Но это редкий случай, и не имеет ничего общего с многопоточностью..)
Проделайте второй и третий потоки только получают доступ к DLL, как только первый поток выполняется с помощью статического метода DLL?
Нет; статические методы: не автоматически сериализован. Если вам нужен метод, чтобы гарантировать, что только один поток обращается к нему за раз, вам придется писать код, чтобы сделать это самостоятельно.
Статические конструкторы действительно ведут себя как будто. Время выполнения гарантирует, что поток, который «выигрывает гонку», будет запускать статический конструктор. Остальные потоки будут ждать завершения первого потока. Прочтите мою недавнюю серию статей об этом для деталей.
Под «сериализованным» вы подразумеваете «правильно заказанный» или «правильно упорядоченный?»? Сериализация заставляет меня думать о чем-то другом. –
@RobertHarvey: «Сериализация» означает сериализацию в смысле предоставления заказа на доступ к ресурсу несколькими потоками. К сожалению, это тот же термин, который используется для концепции хранения объекта на диске или передачи его по проводу. Но это правильно. Наиболее распространенной альтернативой является не «секвенирование», а скорее «синхронизация», что, по моему мнению, является немного неправильным. Я согласен, что «секвенирование» было бы лучше, но это не стандартный жаргон. –
Как правило, код загружается один раз, даже для нестатических объектов.
Это информация, содержащаяся в объявленных переменных (совместно называемая состояние), о которой вы должны беспокоиться, а не код.
DLL загружаются в память только один раз.
Если в одном процессе есть несколько потоков, вызывающих вызовы или доступ к глобалам в DLL, DLL должна гарантировать безопасность потоков, защищая доступ к глобальным/общим данным с использованием критических разделов.
Если существует несколько потоков из нескольких процессов, обращающихся к DLL, безопасность потоков не является проблемой, если существует не более одного потока процесса, обращающегося к одной и той же DLL.
Операционная система умело управляет памятью, так что изначально она начинается только с одной копии раздела кода и данных. Страницы раздела данных отображаются только для чтения. Когда возникает необходимость в изменении любых глобальных данных в одном из процессов, ОС получит ошибку сегментации и создаст копию страницы и отобразит ее как записываемую в пространство памяти процесса. Этот подход называется copy-on-write.
- 1. Что делать, если несколько потоков epoll ждут в одном сокете?
- 2. Что произойдет, если в одном классе есть много категорий?
- 3. Что произойдет, если несколько скриптов устанавливают window.onload?
- 4. Что произойдет, если количество потоков в деформации меньше 32?
- 5. Что произойдет, если Runnable выполняется несколько раз в ExecutorService
- 6. Что произойдет, если ViewState Disabled
- 7. Объединить несколько родных DLL в одну DLL
- 8. Что произойдет, если переменная volatile будет записана из 2 потоков?
- 9. Что произойдет, если два разных сеанса активны в одном браузере?
- 10. Что произойдет, если в одном файле есть 2 класса Appdelegate.
- 11. Что произойдет, если NSURLCache заполнен?
- 12. Что произойдет, если action = ""?
- 13. Что произойдет, если заменить подписанную DLL на не подписанную?
- 14. Что произойдет, если в моем приложении не хватает памяти?
- 15. Что произойдет, если статический класс Load failed
- 16. несколько покупок в приложении в одном приложении
- 17. Как создать несколько потоков в одном классе?
- 18. Несколько JFrames в одном приложении
- 19. Что произойдет, если несколько запросов попадут в один сервлет ..?
- 20. Несколько formsauthentifications в одном приложении
- 21. Почему несколько итераторов ввода вызовут неожиданный результат?
- 22. Что произойдет, если * .exe.config удален?
- 23. Что произойдет, если php.ini отсутствует?
- 24. JSR 352 Несколько потоков в одном разделе?
- 25. Что произойдет, если отключить таймер?
- 26. как использовать одноименную DLL в одном приложении
- 27. Что произойдет, если stdin заполняется?
- 28. Что произойдет, если клиент отключится?
- 29. Несколько потоков, написанных в одном файле
- 30. Несколько RCTRootView в одном приложении
Возможно, обратитесь к этому ответу для получения информации о DLL и нескольких потоках? http://stackoverflow.com/a/739719/2076959 – ryrich