Если программы работают в многозадачной системе, то с точки зрения возможности возникновения взаимных блокировок, характерных для параллельного программирования, не так уж и важно, написаны ли программы на языках, напрямую поддерживающих многопоточность, или понятийно они строго однопоточны, включая библиотеки. Просто в этом случае взаимную блокировку гораздо легче осуществить не в изолированной программе, а в совокупной вычислительной среде. Например:
MODULE Files;
IMPORT File := CFiles;
PROCEDURE Delay(f: File.File; v: BYTE);
VAR b: ARRAY 1 OF BYTE; i, ignore: INTEGER;
BEGIN
FOR i := 0 TO 11111 DO
b[0] := v;
ignore := File.Write(f, b, 0, 1);
ignore := ORD(File.Flush(f))
END
END Delay;
PROCEDURE Lock(n: ARRAY OF CHAR; v: BYTE); VAR f: File.File; BEGIN
WHILE File.Exist(n, 0) DO ; END;
f := File.Open(n, 0, "w");
IF f # NIL THEN
Delay(f, v);
File.Close(f)
END
END Lock;
PROCEDURE Unlock(n: ARRAY OF CHAR); VAR ignore: BOOLEAN; BEGIN
ignore := File.Remove(n, 0)
END Unlock;
PROCEDURE Go*(na, nb: ARRAY OF CHAR; v: BYTE); BEGIN
Lock(na, v);
Lock(nb, v);
Unlock(nb);
Unlock(na)
END Go;
END Files.
В командной оболочке:
ost to-bin 'Files.Go("b", "a", ORD("B"))' filesBA -m .
ost to-bin 'Files.Go("a", "b", ORD("A"))' filesAB -m .
./filesAB & ./filesBA
Комментариев нет:
Отправить комментарий