Установить приоритет, когда несколько потоков одновременно пытаются получить разрешение семафора - PullRequest
0 голосов
/ 31 октября 2018

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


Скажем, у меня 3 темы (t1, t2, t3).

Эти потоки имеют доступ к потоку, который реализует семафор (sem) с разрешением 1 и является справедливым (дает FIFO потокам, которые стоят в очереди), и поток, который реализует таймер (timer), который увеличивает int (время) каждый раз 20мс.

Если все 3 потока пришли сюда в своем коде одновременно и ждали, пока таймер увеличит 6 единиц, прежде чем продолжить.

//In a thread t_ class  
int timeInitial = timer.getTime();
while((timeInitial+6)>timer.getTime()) {
    //Sleeps for 10ms to ensure it doesn't miss the timers 20ms 
    increments
    try {
    sleep(10);
    }
    catch (InterruptedException e) {
    }
}
//Thread joins queue for the singular permit
sem.aquire();


//In the sem class
public void acquire() {
    try {
        semaphore.acquire();
    }
    catch (InterruptedException e) {
    }
}


//In the timer class, timer functionality. Also has get and set method for time
@Override
public void run() {
    while(processes > 0) {
        try {
            sleep(21);
            time++;
        }
        catch (InterruptedException e) {
        }
    }
}

Я хотел бы, чтобы несколько потоков пытались получить разрешение в одно и то же время по таймеру, что и при попытке в порядке убывания от наименьшего к наибольшему (t1, t2, t3). Где теперь они будут присоединяться к очереди в, казалось бы, случайном порядке.

Обратите внимание, что если, скажем, t2 и t3 уже были поставлены в очередь для разрешения в момент времени = 6, а время t1 пришло в момент времени = 7, оно не будет переходить в очередь, а будет сравниваться только с другими добавлениями в момент времени = 7 перед очередью (t2, t3, t1).


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

1 Ответ

0 голосов
/ 31 октября 2018

Я думаю, вы хотите, чтобы ваши потоки попадали в очередь с приоритетами, которая будет отсортирована по времени прибытия, а затем по приоритету, когда время будет таким же. Как только поток добавляет себя в эту приоритетную очередь, он входит в wait (). Вам понадобится механизм, который в нужный момент разбудит все потоки в очереди. При пробуждении каждый из них проверял бы, являются ли они главой очереди - те, которые нет, возвращаются в wait (), а та, которая удаляет себя из очереди, уходит и делает свое дело. Может быть, подходящее время - каждый раз, когда выбранный поток завершает свою работу или возвращается в очередь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...