Mutex / многопоточность / проблема с общими ресурсами WinAPI

0

Я очень мало знаю о многопоточности, но я работаю с кодом другого пользователя и нуждаюсь в некоторой помощи, поскольку оригинального программиста больше нет.

Программа имеет свой собственный exe для запуска, но DLL присоединяется к процессу другой программы через APIENTRY (WINAPI)... Когда DLL присоединяется к процессу, он создает пару мьютексов. Проблема в том, что один из этих мьютексов должен быть создан только один раз и должен быть доступен каждому процессу. Кажется, я не могу остановить каждый процесс от создания собственного дескриптора. По крайней мере, во время некоторой операции мне нужно иметь возможность передать дескриптор другим процессам или получить каждый дескриптор из каждого процесса и применить ту же операцию (в основном для синхронизации некоторых переменных). Я пробовал старый статический bool isFirst, но каждый процесс, похоже, создает новый набор переменных, поэтому он не работает.

Я действительно смущен и расстроен. Любые мысли или идеи будут высоко оценены.

Теги:

2 ответа

1

Существует механизм прикрепления DLL, который вызывается каждый раз, когда процесс присоединяется (извините, я не могу вспомнить точное имя), и отдельно есть InitInstance, который вызывается при загрузке DLL. Поэтому, если вы сделаете mutex обрабатывает статические глобальные переменные с помощью DLL, создайте и iinitialise мьютекса в InitInstance и раздайте дескрипторы мьютекса любому процессу, который просит его, вы должны сделать лучше.

  • 0
    Спасибо, это полезно. Есть ли особый способ «раздать» ручки мьютекса? Я создал статический дескриптор в DLL (давайте назовем его handle1) и сделал, как вы советовали, затем использовал WaitForSingleObject (handle1, INFINITE) ... Тем не менее, отдельные процессы, похоже, используют разные дескрипторы ...
  • 0
    Так. Просто чтобы проверить, в InitInstance вы вызываете CreateMutex, чтобы создать мьютекс и получить дескриптор, да? Учитывая это, я бы создал в библиотеке DLL функцию GetMutex () {return g_hMutex;}, которую может вызывать любой из других процессов. Вы вызываете WaitForSingleObject в DLL? Я не понимаю, почему вы хотите это сделать. Важно то, что любой процесс, который владеет мьютексом через WaitForxxxx, ДОЛЖЕН вызывать ReleaseMutex (hand), чтобы позволить другим процессам получить его. Ты это делаешь?
Показать ещё 7 комментариев
0

По-видимому, создаются отдельные экземпляры DLL, вызывающие отдельные сегменты данных. Мне удалось получить дескриптор одного значения в разных экземплярах с помощью data_seg. Теперь я понимаю, что у меня есть новая проблема, хотя я не могу использовать data_seg для фактической переменной (вектора объектов), которую мьютекс защищает от одновременной записи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню