Много писать не буду времени нет, простой вариант.
-Автомобиль - поток т.к. есть run
-Пассажир - поток
-объвлены семафоры
Пассажиры должны вызывать методы board и unboard.
зедсь думую понятно - board,unboard - работаешь с семаформи автомобиля.
Пассажиры не могут сесть в машину, пока Автомобиль не вызывет метод load(нагрузки)
1 . у класса автомобиля модно сделать флаг (bool) -bool m_canLoad - Этот флаг будет выставляться функцией load, пассажиры в потоке периодически (или по таймеру ) считываю переменную (чтение - потокобезопасная операция)
2. или реализовать с помощью сигналов\слотов, например CAvto::signal_load() ->CPass::slot_load();
второй вариант,думую, по проще
автомобиль не может уехать пока не наберет C пассажиров.
1 . Класс автомобиля, после того как выставил флаг
m_canLoad проверяет сколько "в него село " пассажиров.
2. либо при посадке пассажир посылает сигнал, а класс автомобиля принимая его увеличивает счетчик, одновременно проверяя его
Пассажиры не могут вызывать метод unboard пока автомобиль не вызывет метод unload(выгрузки).
аналогично нагрузки
-----