Правильно синхронизированный код C

#c #synchronized

#c #синхронизированный

Вопрос:

Некоторое время назад мне был задан вопрос, на который я не уверен, как ответить, вопрос набран ниже: может кто-нибудь дать мне представление о том, как я должен это делать, используя C

напишите код, который поможет синхронизировать преподавателя и его / ее студентов в рабочее время. Профессор, конечно, хочет вздремнуть, если рядом нет студентов, чтобы задавать вопросы; если есть студенты, которые хотят задавать вопросы, они должны синхронизироваться друг с другом и с профессором, чтобы в любой момент времени говорил только один человек, на каждый вопрос студента отвечает профессор, и ни один студент не задает еще один вопрос до того, как профессор закончит отвечать на предыдущий. Вам нужно написать четыре процедуры: AnswerStart(), AnswerDone(), QuestionStart() и QuestionDone() . Профессор выполняет цикл выполнения кода: AnswerStart(); give answer; AnswerDone() . AnswerStart не возвращается до тех пор, пока не будет задан вопрос. Каждый учащийся выполняет цикл выполнения кода: QuestionStart(); задать вопрос; QuestionDone() . QuestionStart() не возвращается, пока не настанет очередь студента задать вопрос. Поскольку преподаватели считают невежливым для студента не дожидаться ответа, функция QuestionEnd() не должна возвращаться, пока профессор не закончит отвечать на вопрос.

Комментарии:

1. Многопоточность и синхронизация потоков не реализованы в стандартном C ; это делается с использованием библиотек, специфичных для ОС. В какой ОС вы это делаете? (на всякий случай; ОС = операционная система)

2. @dario_ramos: теперь они есть; C 11 имеет стандартизированную модель памяти и библиотеку поддержки потоков.

3. @Mike: я почти уверен, что OP использует более старый стандарт (поскольку он пометил свой пост C , а не C 11), но в любом случае, хорошо сообщить ему об этом. 1.

4. @MikeSeymour Мой компилятор пока не поддерживает потоки C 11 … :/ По крайней мере, у нас есть boost.

5. Повышение. Поток довольно близок к тому, что скоро появится в C — boost.org/doc/libs/1_47_0/doc/html/thread.html

Ответ №1:

Блокировки чтения / записи могут быть тем, что вы ищете.

Это звучит как вопрос домашнего задания, в соответствии с рекомендациями сообщества, можете ли вы сообщить нам, что вы пробовали?

Комментарии:

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

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

Ответ №2:

Я предполагаю, что это назначение класса, поэтому я не буду давать ответ.

Я бы справился с этим с помощью активного объекта.

Комментарии:

1. Я специально был расплывчатым, Херб Саттер: drdobbs.com/go-parallel/article /…

Ответ №3:

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

http://www.cs.utexas.edu /~лаванда/курсы/cs371/лекции/лекция-10.pdf