2016-06-04 5 views
-2

Мне нужна помощь.Семафоры в c linux с клиентом/сервером

Я хочу создать 2 семафоров: 1-й семафор. для клиента, чтобы заблокировать семафор, когда он закончил запись в общую память, - и только сервер сможет читать из общей памяти. 2-й семафор. после того, как сервер будет красным из общей памяти, сервер откроет семафор для записи.

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

У кого-нибудь есть идея, как это сделать?

tnx.

+2

"Семафор" не является вопросом. Семафор - это решение. Пожалуйста, укажите, чего вы на самом деле пытаетесь достичь. См. Http://stackoverflow.com/help/how-to-ask –

+0

Я хочу, чтобы клиент записывался в общую память, а потом только сервер может работать (читать разделяемую память). Затем (после красных данных сервера) какой-либо клиент может записать в общую память. и т. д. ... –

+0

Вы хотите, чтобы только один клиент мог писать в буфер за раз? –

ответ

1

Один из способов решить это два семафора, контролирующих доступ. Один семафор устанавливает, разрешено ли клиенту писать в буфер, а другое - разрешено ли ему читать на нем.

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

Сервер, в цикле, получает считываемый семафор, обрабатывает данные и затем увеличивает семафор записи.

Однако это решение имеет серьезную проблему с производительностью. Все ваши задачи, фактически, полностью сериализованы. Ни один клиент не может отправлять задания, пока сервер обрабатывает эти задания. Два клиента не могут одновременно создавать рабочие места. Несмотря на ваш многопоточный дизайн, вы эффективно используете только одно ядро.

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

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