Я довольно новичок в программировании Win32. Я хочу создать общую память между двумя процессами. Я уже создал общую память, используя функцию Memory Mapping.
Моя структура будет выглядеть так:
struct sharedMemory
{
int ans1;
int ans2;
BOOLEAN flag1;
};
Теперь я могу получить доступ к этой общей памяти из разных процессов, но я не совсем понимаю, как применить блокировку к этой общей памяти, чтобы только 1 процесс мог получить доступ к переменной члена структуры.
Предоставляя имя мьютекса при вызове CreateMutex
, вы сделаете мьютекс видимым из других процессов.
Если другой процесс передает то же имя CreateMutex
, он получит существующий мьютекс (вместо создания нового), который затем может быть использован для синхронизации между процессами.
Общая память — это просто страницы памяти, которые загружаются в адресное пространство различных программ, поэтому совместное использование памяти не имеет ничего общего с доступом к нему процесса. Для того, чтобы справиться с этим в любой ОС, включая Windows и Posix, вы должны создать свой собственный механизм синхронизации.
Чтобы справиться с этим, вам нужно выполнить шаги, процесс сообщает другому процессу, что данные готовы (в Win32 вы можете использовать именованные события, для получения дополнительной информации смотрите CreateEvent), а другим шагом является эксклюзивный доступ к общей памяти через некоторый механизм синхронизации (в Win32 это может быть выполнено с использованием именованных мьютексов, для получения дополнительной информации см. CreateMutex).
Слегка запутанные, отображенные в память файлы являются потокобезопасными Многочисленные потоки могут получить доступ к одному или нескольким представлениям файлов с правами чтения и чтения / записи.
В любом случае, вам нужна межпроцессная блокировка, чтобы позволить только одному потоку касаться вашей структуры (Mutex).
Вы можете сделать одну из двух вещей,
1) Создайте мьютекс и заблокируйте его с помощью функций мьютекса (см. Ссылку на MSDN)
2) Создать или использовать логическое значение, true для блокировки (то есть выполняется некоторое копирование, изменение или использование данных) и false для разблокировки (родительский или главный поток имеет дело с этим).
Таким образом, вы можете сделать:
int someThread1(threadData *data)
{
data->lock = true;
/* Do data functions */
data->lock = false;
return 1; //Or whatever you want it to return after checking data
}
int someThread2(threadData *data)
{
data->lock = true;
/* Do data functions */
data->lock = false;
return 1; //Or whatever you want it to return after checking data
}
void *masterThread(void *data)
{
ThreadData * t_Data = (ThreadData*)data;
do
{
if(t_Data->lock == false)
{
/*Do normal operations */
}
else
{
Sleep(10); //Give the CPU a break
//Do whatever else you need
}
}while(someCondition == true);
return 0;
}
Я знаю, что вышеупомянутое не совсем стандартно, или идеально. Но это просто способ управления потоками вручную, если не использовать мьютекс. Просто идея / предложение