2013-02-26 1 views
4

Я хотел знать, что происходит, когда три потока в одном приложении вызывают статический метод из DLL (почти) одновременно. Существуют ли 3 экземпляра DLL, загружаемых для каждого потока, или другие потоки получают доступ к DLL только после того, как первый поток выполняется с помощью статического метода DLL (например, каждый поток получает доступ к dll после его поворота?Что произойдет, если несколько потоков в одном приложении вызовут одну DLL

+0

Возможно, обратитесь к этому ответу для получения информации о DLL и нескольких потоках? http://stackoverflow.com/a/739719/2076959 – ryrich

ответ

9

Есть ли 3 экземпляра загруженной DLL, по одной для каждой темы?

Количество DLL - обычно загружается один раз в процессе. (Есть некоторые тонкие вопросы здесь, возможно для того же сборка будет загружаться в два раза, если вы используете Load и LoadFrom Но это редкий случай, и не имеет ничего общего с многопоточностью..)

Проделайте второй и третий потоки только получают доступ к DLL, как только первый поток выполняется с помощью статического метода DLL?

Нет; статические методы: не автоматически сериализован. Если вам нужен метод, чтобы гарантировать, что только один поток обращается к нему за раз, вам придется писать код, чтобы сделать это самостоятельно.

Статические конструкторы действительно ведут себя как будто. Время выполнения гарантирует, что поток, который «выигрывает гонку», будет запускать статический конструктор. Остальные потоки будут ждать завершения первого потока. Прочтите мою недавнюю серию статей об этом для деталей.

http://ericlippert.com/tag/static-constructors/

+0

Под «сериализованным» вы подразумеваете «правильно заказанный» или «правильно упорядоченный?»? Сериализация заставляет меня думать о чем-то другом. –

+3

@RobertHarvey: «Сериализация» означает сериализацию в смысле предоставления заказа на доступ к ресурсу несколькими потоками. К сожалению, это тот же термин, который используется для концепции хранения объекта на диске или передачи его по проводу. Но это правильно. Наиболее распространенной альтернативой является не «секвенирование», а скорее «синхронизация», что, по моему мнению, является немного неправильным. Я согласен, что «секвенирование» было бы лучше, но это не стандартный жаргон. –

3

Как правило, код загружается один раз, даже для нестатических объектов.

Это информация, содержащаяся в объявленных переменных (совместно называемая состояние), о которой вы должны беспокоиться, а не код.

1

DLL загружаются в память только один раз.

Если в одном процессе есть несколько потоков, вызывающих вызовы или доступ к глобалам в DLL, DLL должна гарантировать безопасность потоков, защищая доступ к глобальным/общим данным с использованием критических разделов.

Если существует несколько потоков из нескольких процессов, обращающихся к DLL, безопасность потоков не является проблемой, если существует не более одного потока процесса, обращающегося к одной и той же DLL.

Операционная система умело управляет памятью, так что изначально она начинается только с одной копии раздела кода и данных. Страницы раздела данных отображаются только для чтения. Когда возникает необходимость в изменении любых глобальных данных в одном из процессов, ОС получит ошибку сегментации и создаст копию страницы и отобразит ее как записываемую в пространство памяти процесса. Этот подход называется copy-on-write.

Смежные вопросы