Загрузка одного и того же экземпляра DLL в нескольких процессах - PullRequest
3 голосов
/ 13 мая 2011
Lib1[dll]
{
class A
{
static int i=0;
}
}

Program1[exe] have reference to Lib1
{
 Class B
 {
    main()
    {
      A.i = 5;
    }
 }
}

Program2 [exe] have reference to Lib1
{
 Class C
 {
    main()
    {
      A.i = 5;
    }
 }
}

Если Program1 и Program2 выполняются одновременно, возможно ли, что они ссылаются на один экземпляр Lib1 и изменения, внесенные в статическую переменную A.i в Program1, доступны для Program2 и наоборот,

1 Ответ

8 голосов
/ 13 мая 2011

В общем, нет, то, что вы просите, невозможно или не рекомендуется.В большинстве операционных систем (Windows, Linux и т. Д.) Каждый экземпляр программы выполняется в отдельном адресном пространстве процесса, изолированном от всех других процессов.В некоторых случаях исполняемый код общих библиотек DLL, доступный только для чтения, может использоваться несколькими процессами для снижения общего потребления памяти, но доступные для записи данные являются локальными для каждого процесса.

Вы можете добиться того, чего просите,использование служб ОС для явной настройки области общей памяти, к которой могут обращаться несколько процессов.В Windows это можно сделать, создав именованные объекты общей памяти , используя имя, заранее известное всем участникам.Затем вы можете типизировать этот блок памяти к типу структуры и прочитать и записать поля в этой области памяти, и все процессы, которые имеют вид на эту совместно используемую память, будут видеть одни и те же данные.

Поскольку несколько процессов работают одновременноВам также необходимо подумать о том, как обновляются данные в области общей памяти.Если нескольким процессам необходимо обновить поле счетчика или еще что-то в области совместно используемой памяти, вам необходимо внедрить потоковые методы для чтения и записи этих данных, такие как инкремент с приращением или использование именованного объекта мьютекса в качестве исключительной блокировки доступа.

...