2011-07-11 2 views
3

Я работаю над проектом, который создает два процесса, и я хочу регулировать IPC между ними.Регулирование 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; 
} 

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

+0

FYI - У Windows есть семафоры (CreateSemaphore), хотя, если вам нужно всего лишь блокировать Mutex лучше, поскольку он обнаруживает мертвые держатели мьютексов. – bdonlan

ответ

1

Вы можете создать анонимную мьютекс с помощью CreateMutex, а затем попытаться найти его по имени

+0

Благодарим вас за отзыв, поэтому я создаю мьютекс с процессами 1 и нахожу его с процессами 2? Как найти его, у вас есть пример? – RSNL

+0

и CreateMutex, и OpenMutex имеют параметр 'LPCTSTR lpName', вы не используете его CreateMutex, и я не знаю, какое значение MUTEXNAME находится в вашем OpenMutex. – Ulterior

4

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

От OpenMutex docs:

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

Каждый Win32 API может выйти из строя - вам необходимо правильно проверить и обработать эти ошибки.

+0

Спасибо за отзыв! Я проверил ошибки на моих WINAPI-вызовах, и открытый вызов действительно не удался. И я забыл указать имя мьютекса в вызове mutexCreate. – RSNL

+1

Хорошие новости - это сэкономит много боли, если вы привыкнете проверять все эти вызовы API и изящно не умеете с подходящим выходом ошибки –

0

Вы должны указать UNIQUE имя mutex как в CreateMutex, так и в OpenMutex.

Смежные вопросы