проблема однополосного моста - PullRequest
3 голосов
/ 11 октября 2010

Если вы не знакомы с проблемой, это что-то вроде это .

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

Мое решение в настоящее время выглядит примерно так:

(по умолчанию sem_t север и юг = 1 для разблокировки на 1 автомобиль)

ЕСЛИ Northcar, то sem_wait (юг), sem_wait (север). Перейдите через мост, а затем sem_post (север), sem_post (юг). Это, очевидно, неправильно, потому что он блокирует мост от всех автомобилей, кроме той, что на нем. Я хочу, чтобы трафик шел вместе. Есть идеи?

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

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

В реальной жизни вы могли бы решить эту проблему с помощью светофора: красный-север / зеленый-юг, зеленый-север / красный-юг или красный-север / красный-юг, и датчики на подходе и выходеполосы на обоих концах моста.

Предположим, что свет начинается красным-северным / зеленым-южным.Автомобили могут течь с юга на север без остановки.Когда автомобиль приближается с севера, он останавливается на красный свет и включает датчик приближения на север.Это заставляет свет идти красным на юг, но он все еще красный на север.Когда все машины, находящиеся в настоящее время на мосту, уехали (срабатывающий северный датчик выхода на выходе), свет может измениться на зеленый север.Это состояние сохраняется до тех пор, пока другая машина не придет с юга и не сработает датчик приближения на юг.

Подумайте, как бы вы перевели это в код.(Вам нужно будет использовать свойство подсчета семафоров.)

0 голосов
/ 11 октября 2010

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

function main():
    while(true):
        if(north_car):
            let_north_cars_through()
        if(south_car):
            let_south_cars_through()


function let_south_cars_through():
    sem_wait(north)
    for(i = 0; i < max cars; i++):
        if(south_car):
            cross_bridge()
        else:
            break;

    sem_post(north)

function let_north_cars_through()
    sem_wait(south)
    for(i = 0; i < max cars; i++):
        if(north_car):
            cross_bridge()
        else:
            break;

    sem_post(south)
...