Статус
нашего
сайта:
ICQ Secrets Center is Online  ICQ Information Center


ICQ SHOP
     5-значные
     6-значные
     7-значные
     8-значные
     9-значные
     Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
     Mail Checkers
     Bruteforces
     ICQTeam Soft
     8thWonder Soft
     Other Progs
     ICQ Patches
     Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal

Реклама

Наш канал:

irc.icqinfo.ru

Таненбаум Э.- Архитектура компьютера. стр.362


Таненбаум Э.- Архитектура компьютера. стр.362

Давайте еще раз вернемся к состоянию гонок. Пусть в определенный момент in = 22, a out = 21, производитель выполняет оператор Р1, а потребитель — оператор С5. Потребитель завершает действие и переходит к оператору СІ, в котором вызывается метод down для семафора filled, до вызова имевшего значение 1, а после вызова получившего значение 0. Затем потребитель извлекает последнее число из буфера и вызывает метод up для семафора available, после чего available принимает значение 100. Потребитель печатает это число и переходит к оператору С1. Как раз перед тем, как потребитель собирается вызвать метод down, производитель формирует следующее число и быстро выполняет операторы Р2, РЗ и Р4.

В этот момент filled = 0. Производитель собирается вызывать для этого семафора метод up, а потребитель — метод down. Если потребитель сделает вызов первым, он будет приостановлен до тех пор, пока производитель его не освободит (вызвав метод up). Если же первым вызов сделает производитель, то сема фор получит значение 1, и потребитель вообще не будет приостановлен. В обоих случаях сигнал запуска не пропадет. Именно для этого мы и ввели в программу семафоры.

Листинг 6.2. Параллельная работа с использованием семафоров

public class m {

final public static int BUF_SIZE = 100; // буфер от 0 до 99

final public static long MAX_PRIME=100000000000L; // остановиться здесь public static int in = 0, out = 0; // указатели на данные

public static long buffer[ ] = new long[BUF_SIZE]; // здесь хранятся числа public static producer p; // имя производителя

public static consumer с; // имя потребителя

public static int filled = 0, available = 100; // семафоры

public static void main(String args[ ]) { // основной клласс

p = new producerO; // создание производителя

с = new consumerO; // создание потребителя

p.startO; // запуск производителя

c.startO; // запуск потребителя

}

// Это прикладная функция для циклического увеличения in и out

public static int next(int Ю {if (k < BUF_SIZE - 1) return(k+l); else return(O);}

}

class producer extends Thread { // класс производителя

native void up(int s); native void down(int s); // методы для семафоров public void run() { // код производителя

long prime = 2; // временная переменная

while (prime < m.MAX_PRIME) { prime = next_prime(prime); // оператор PI

down(m.avail able); // оператор P2

m.buffer[m.in] = prime; // оператор P3

m.in = m.next(m.in); // оператор P4

up(m.filled); // оператор P5

}

}

// Функция, которая вычисляет следующее число private long next_prime(long prime){ ...}

}

class consumer extends Thread { // класс потребителя

native void up(int s); native void down(int s); // методы для семафоров public void run() { // код потребителя

long emirp = 2; // временная переменная

while (emirp < m.MAX_PRIME) { down(m.filled); // оператор CI

emirp = m.buffer[m.out]; // оператор C2

m.out = m.next(m.out); // оператор C3

up(m. available); // оператор C4


⇐ Предыдущая страница| |Следующая страница ⇒

Карта Сайта