Регулирование IPC между двумя процессами с мьютексом - PullRequest
3 голосов
/ 11 июля 2011

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

Процессы создаются с помощью функции createProces, и я хочу использовать мьютекс для выполнения IPC.

В Linux я делаю это с семафорами, однако я прочитал, что для IPC в Windows я должен использовать мьютекс.

В окнах я не могу заставить его работать. Сначала я создаю шаги следующим образом:

CreateProcess(IpApplicationName, NULL, NULL, NULL, FALSE,   CREATE_NEW_CONSOLE, NULL, NULL,     &StartInfo, &ProcessInfo);
CreateProcess(IpApplicationName, NULL, NULL, NULL, FALSE,   CREATE_NEW_CONSOLE, NULL, NULL,     &StartInfo2, &ProcessInfo2);

Процессы запускаются нормально, но когда я удаляю вызов releaseMutex из одного процесса, он не будет дожидаться этого процесса. Вот процесс один:

volatile HANDLE hMutex; // Global hMutex Object


int main()
{
     hMutex=CreateMutex(NULL,FALSE,NULL);

    while(1)
    {

        WaitForSingleObject(hMutex,INFINITE);
        printf("Thread writing to database...\n");
        Sleep(2000);
        ReleaseMutex(hMutex);
    }

    return 0;
 }

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

int main()
{

 while(1)
 {
    HANDLE hMutex;

    hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,MUTEXNAME);

    WaitForSingleObject(hMutex,INFINITE);
    printf("Thread writing to database22...\n");
    Sleep(2000);
    //ReleaseMutex(hMutex);
 }

    return 0;
}

Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 11 июля 2011

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

Из документов OpenMutex :

Функция OpenMutex позволяет нескольким процессам открывать дескрипторы тот же объект мьютекса. Функция завершается успешно, только если какой-то процесс уже создал мьютекс с помощью функции CreateMutex.

Любой Win32 API может дать сбой - вам нужно проверить и правильно обработать эти ошибки.

1 голос
/ 11 июля 2011

Вы создаете анонимный Mutex, используя CreateMutex, затем пытаетесь найти его по имени

0 голосов
/ 13 октября 2011

Вы должны указать UNIQUE имя мьютекса как для процесса в CreateMutex, так и для OpenMutex.

...