у меня 10 потоков и у каждого свой ID от 1 до 10; все потоки должны выполнять 2 фазы (т. е. фаза 1 и фаза 2). Я пытаюсь заставить все потоки сначала завершить свою фазу 1, прежде чем какой-либо поток войдет в фазу 2, используя семафоры (я сделал это, и это работает хорошо), но затем я должен запустить все 10 потоков в порядке их TID (идентификатор потока). Перепробовал много способов, но результата не получил! Конечный результат, который я получил, работает только для первых 4 потоков (иногда 5 или 6), а затем для остальных потоков появляется беспорядок в порядке!
Это мои созданные семафоры:
...private static Semaphore mutex = new Semaphore(1);
// s1 is to make sure phase I for all is done before any phase II begins
private static Semaphore s1 = new Semaphore(0);
// s2 is for use in conjunction with Thread.turnTestAndSet() for phase II proceed in the thread creation order
private static Semaphore s2 = new Semaphore(1);
private static int n=10;
private static int count = 0;
Это мой метод для потоков:
static class AcquireBlock extends BaseThread
{
public void run()
{
mutex.P();
phase1();
count++;
mutex.V();
if (count == n)
{
s1.V();
}
s1.P();
s1.V();
while(!this.turnTestAndSet());
s2.P();
phase2();
s2.V();
}
} // class AcquireBlock
метод turnTestAndSet выглядит следующим образом:
public synchronized boolean turnTestAndSet()
{
if(siTurn == this.iTID)
{
siTurn++;
return true;
}
return false;
}
где siTurn инициализируется значением 1.
Проблема, которая у меня есть в моем коде (я думаю), заключается в том, что когда поток достигает цикла While [while(!this.turnTestAndSet())], он может успешно пропустить цикл (в случае успеха), но другой поток может начать и выполнить свой цикл while до того, как предыдущий поток перейдет к фазе 2! Таким образом, siTurn может продолжать увеличиваться до того, как какой-либо поток войдет в фазу 2.
Я знаю, что должен лучше использовать семафор s2 и попытаться извлечь из него пользу, а не использовать его как мьютекс. Любое новое решение этого трюка или ремонт моего текущего решения ?? или общее решение с использованием семафоров, чтобы я мог применить его к своему коду.