2017-01-25 11 views
0

У меня проблема с синхронизацией 2 процессов. У меня есть 3 процесса X и 5 Y процессов. Также у меня есть 2 ресурса - A и B.Взаимное исключение и синхронизация процессов; C++

Ресурс 'A' может быть использован максимум 3 экземплярами одновременно и путем обращения к ресурсу 'B' необходимо взаимное исключение.

процесс X и Y:

void processX() 
{ 
    while (1) 
    { 
     AccessToResource(B); 

     AccessToResource(A); 
    } 
} 

void processY() 
{ 
    while (1) 
    { 
     AccessToResource(A); 

     AccessToResource(B); 
    } 
} 

Как я могу это сделать с помощью семафоров, мьютексы, события, кратчайший путь?

Теперь у меня есть

CSemaphore sem(1,5,L"semaph"); 

и используя его sem.Lock() и sem.Unlock() до и после получения доступа к ресурсу, но это не совсем хорошо.

+0

Таким образом, вам не нужно одновременно блокировать доступ к A и B? Доступ к каждому ресурсу можно обрабатывать отдельно от другого? –

+0

Процессы X и Y работают одновременно. Я не знаю, как с этим справиться, это моя первая задача с чем-то подобным – Pawel

+0

@Pawel the C++ standard не имеет понятия о процессе, а стандартная библиотека не имеет API-интерфейсов между процессами. Вам нужно указать API, который вы собираетесь использовать в вопросе. – user2079303

ответ

2

Resource'A»может быть использовано не более 3

Состояние процессов

Подсчет семафора будет вполне подходящим здесь (см wiki). Он работает следующим образом:

У вас есть счетчик (таким образом, имя), инициализированный 0. Каждый раз, когда какой-то процесс владеет ресурсом А, он увеличивает этот семафор на 1. Если счет попадает 3 в вашем случае, это будет означать, что уже есть 3 с использованием ресурса 'A'. После завершения процесса с использованием ресурса «A» он уменьшает счетчик (semafore) на 1, что позволяет другим процессам использовать этот ресурс.

путем доступа к ресурсу «В» взаимной необходимо исключить

Здесь подходящим решением было бы mutex (или бинарный семафор). Они оба работают почти одинаково - разница в том, что mutex имеет преимущество на за счет ресурса.

+0

'std :: mutex' не поможет, если OP фактически использует * процессы *, а не потоки. Однако это деталь реализации, и мы на самом деле не знаем достаточно, чтобы определить, хочет ли OP получить ответ, специфичный для конкретной реализации, или общий ответ (который вы предоставили). –

+0

@Someprogrammerdude Да, извините, я просто был введен в заблуждение тегом C++. Исправлен ответ. –

+0

@ Юрий Ивашкевич Общий ответ в порядке, так как конкретная реализация. Я думаю, что для меня достаточно ответа :) Большое спасибо – Pawel

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