Как обеспечить доступ только к одному процессу одновременно?

Я довольно новичок в программировании Win32. Я хочу создать общую память между двумя процессами. Я уже создал общую память, используя функцию Memory Mapping.

Моя структура будет выглядеть так:

struct sharedMemory
{
int ans1;
int ans2;
BOOLEAN flag1;
};

Теперь я могу получить доступ к этой общей памяти из разных процессов, но я не совсем понимаю, как применить блокировку к этой общей памяти, чтобы только 1 процесс мог получить доступ к переменной члена структуры.

2

Решение

Предоставляя имя мьютекса при вызове CreateMutex, вы сделаете мьютекс видимым из других процессов.

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

4

Другие решения

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

Чтобы справиться с этим, вам нужно выполнить шаги, процесс сообщает другому процессу, что данные готовы (в Win32 вы можете использовать именованные события, для получения дополнительной информации смотрите CreateEvent), а другим шагом является эксклюзивный доступ к общей памяти через некоторый механизм синхронизации (в Win32 это может быть выполнено с использованием именованных мьютексов, для получения дополнительной информации см. CreateMutex).

1

Слегка запутанные, отображенные в память файлы являются потокобезопасными Многочисленные потоки могут получить доступ к одному или нескольким представлениям файлов с правами чтения и чтения / записи.

В любом случае, вам нужна межпроцессная блокировка, чтобы позволить только одному потоку касаться вашей структуры (Mutex).

0

Вы можете сделать одну из двух вещей,
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;
}

Я знаю, что вышеупомянутое не совсем стандартно, или идеально. Но это просто способ управления потоками вручную, если не использовать мьютекс. Просто идея / предложение

0
По вопросам рекламы [email protected]