Страницы

Взаимная блокировка в однопоточном языке

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


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

Комментариев нет:

Отправить комментарий