259:, are used for scheduling within monitors. Each variable of type queue can hold one process. If many processes are to be delayed in a monitor, multiple queue variables, usually organized as an array, must be provided. The single process queue variable gives a monitor full control over medium-term scheduling, but the programmer is responsible for unblocking the correct process.
262:
A process, like a class or monitor, has local variables, procedures, and an initial statement, but has no procedure entries. The initial statement ordinarily executes forever, calling local procedures, class procedures, and monitor procedures. Processes communicate through monitor procedures.
247:
Classes and monitors are similar: both package private variables and procedures with public procedures (called procedure entries). A class instance can be used by only one process, whereas a monitor instance may be shared by processes. Monitors provide the only mechanism for interprocess
266:
The configuration of processes, monitors, and classes in a
Concurrent Pascal program is normally established at the start of execution, and is not changed thereafter. The communication paths between these components are established by variables passed in the
263:
Language rules prevent deadlock by imposing a hierarchy on monitors. But nothing can prevent a monitor from erroneously forgetting to unblock a delayed process (by not calling continue) so the system can still effectively hang up through programming errors.
234:
These omissions make it possible to guarantee, by a combination of compile-time checks and minimal run-time checking in the threaded-code interpreter, that a program can not damage itself or another program by addressing outside its allotted space.
958:
951:
178:, is used as the language for applications programs run by the operating systems written in Concurrent Pascal. Both languages are extensions of
238:
Concurrent Pascal includes class, monitor, and process data types. Instances of these types are declared as variables, and initialized in an
1318:
944:
1059:
251:
Only one process can execute within a given monitor instance at a time. A built in data type, the queue, together with operations
976:
1323:
924:
1172:
1248:
1054:
999:
221:
1278:
984:
967:
279:
The following example shows the declaration of a simple monitor, and its use by two communicating processes.
183:
136:
113:
51:
1048:
1014:
101:
1202:
1272:
1243:
1187:
1212:
216:
187:
97:
1192:
1177:
1099:
271:
statements, since class and monitor instance variables cannot be used as procedure parameters.
34:
30:
198:
Several constructs in Pascal were removed from
Concurrent Pascal for simplicity and security:
156:
148:
38:
25:
8:
164:
1230:
1197:
1073:
108:
1044:
936:
920:
152:
63:
1296:
1135:
1094:
894:
160:
58:
1115:
1312:
1222:
1125:
1079:
994:
989:
898:
190:. The following describes how Concurrent Pascal differs from Wirth's Pascal.
179:
168:
48:
883:
1207:
1130:
1120:
227:
1150:
1140:
1069:
1019:
93:
88:
1182:
1145:
1084:
211:
1064:
770:"declare instances of the monitor, producer, and consumer"
1290:
1284:
1266:
1029:
128:
1089:
1004:
773:"give the producer and consumer access to the monitor"
132:
116:
1260:
240:
205:
1164:
966:
1310:
248:communication in a Concurrent Pascal program.
952:
914:
881:
884:"The programming language Concurrent Pascal"
959:
945:
891:IEEE Transactions on Software Engineering
755:"get an item from the monitor"
917:The Architecture of Concurrent Programs
677:"pass an item to the monitor"
193:
1311:
857:"start the consumer process"
842:"start the producer process"
335:"used by only two processes"
940:
653:"execute in a loop forever"
464:"Gets item from the buffer"
350:"true if an item is saved:"
910:
908:
314:"saved item is an integer"
226:File types, and associated standard
186:, and share a common threaded code
13:
1319:Pascal programming language family
827:"initialize the monitor"
689:"Consumer uses a buffer"
605:"Producer uses a buffer"
581:"Initialize the monitor"
287:"Bounded buffer monitor"
14:
1335:
905:
882:Brinch Hansen, Per (June 1975).
1249:Comparison of Pascal and Delphi
353:"Puts item in buffer"
875:
1:
1324:Pascal (programming language)
868:
758:"consume the item"
572:"unblock producer"
557:"mark as not full"
455:"unblock consumer"
7:
968:Pascal programming language
915:Brinch Hansen, Per (1977).
656:"produce an item"
75:; 50 years ago
10:
1340:
1244:Comparison of Pascal and C
521:"block if empty"
274:
1239:
1221:
1163:
1108:
1037:
1028:
975:
422:"save the item"
404:"block if full"
127:
122:
107:
87:
69:
57:
44:
24:
1213:Visual Component Library
899:10.1109/tse.1975.6312840
539:"get the item"
440:"mark as full"
281:
212:Procedures as parameters
1193:Object Windows Library
167:monitoring systems on
208:statement, and labels
174:A separate language,
194:Language description
157:concurrent computing
149:programming language
16:Programming language
165:real-time computing
70:First appeared
21:
1231:Pascal MicroEngine
94:Static and dynamic
19:
1306:
1305:
1159:
1158:
1010:Concurrent Pascal
926:978-0-13-044628-2
919:. Prentice Hall.
176:Sequential Pascal
161:operating systems
159:programs such as
153:Per Brinch Hansen
145:Concurrent Pascal
142:
141:
89:Typing discipline
64:Per Brinch Hansen
20:Concurrent Pascal
1331:
1297:Component Pascal
1257:
1136:Microsoft Pascal
1095:Pic Micro Pascal
1035:
1034:
961:
954:
947:
938:
937:
931:
930:
912:
903:
902:
888:
879:
864:
861:
858:
855:
852:
849:
846:
843:
840:
837:
834:
831:
828:
825:
822:
819:
816:
813:
810:
807:
804:
801:
798:
795:
792:
789:
786:
783:
780:
777:
774:
771:
768:
765:
762:
759:
756:
753:
750:
747:
744:
741:
738:
735:
732:
729:
726:
723:
720:
717:
714:
711:
708:
705:
702:
699:
696:
693:
690:
687:
684:
681:
678:
675:
672:
669:
666:
663:
660:
657:
654:
651:
648:
645:
642:
639:
636:
633:
630:
627:
624:
621:
618:
615:
612:
609:
606:
603:
600:
597:
594:
591:
588:
585:
582:
579:
576:
573:
570:
567:
564:
561:
558:
555:
552:
549:
546:
543:
540:
537:
534:
531:
528:
525:
522:
519:
516:
513:
510:
507:
504:
501:
498:
495:
492:
489:
486:
483:
480:
477:
474:
471:
468:
465:
462:
459:
456:
453:
450:
447:
444:
441:
438:
435:
432:
429:
426:
423:
420:
417:
414:
411:
408:
405:
402:
399:
396:
393:
390:
387:
384:
381:
378:
375:
372:
369:
366:
363:
360:
357:
354:
351:
348:
345:
342:
339:
336:
333:
330:
327:
324:
321:
318:
315:
312:
309:
306:
303:
300:
297:
294:
291:
288:
285:
270:
258:
254:
243:
83:
81:
76:
59:Designed by
22:
18:
1339:
1338:
1334:
1333:
1332:
1330:
1329:
1328:
1309:
1308:
1307:
1302:
1255:
1235:
1217:
1155:
1104:
1024:
971:
965:
935:
934:
927:
913:
906:
886:
880:
876:
871:
866:
865:
862:
859:
856:
853:
850:
847:
844:
841:
838:
835:
832:
829:
826:
823:
820:
817:
814:
811:
808:
805:
802:
799:
796:
793:
790:
787:
784:
781:
778:
775:
772:
769:
766:
763:
760:
757:
754:
751:
748:
745:
742:
739:
736:
733:
730:
727:
724:
721:
718:
715:
712:
709:
706:
703:
700:
697:
694:
691:
688:
685:
682:
679:
676:
673:
670:
667:
664:
661:
658:
655:
652:
649:
646:
643:
640:
637:
634:
631:
628:
625:
622:
619:
616:
613:
610:
607:
604:
601:
598:
595:
592:
589:
586:
583:
580:
577:
574:
571:
568:
565:
562:
559:
556:
553:
550:
547:
544:
541:
538:
535:
532:
529:
526:
523:
520:
517:
514:
511:
508:
505:
502:
499:
496:
493:
490:
487:
484:
481:
478:
475:
472:
469:
466:
463:
460:
457:
454:
451:
448:
445:
442:
439:
436:
433:
430:
427:
424:
421:
418:
415:
412:
409:
406:
403:
400:
397:
394:
391:
388:
385:
382:
379:
376:
373:
370:
367:
364:
361:
358:
355:
352:
349:
346:
343:
340:
337:
334:
331:
328:
325:
322:
319:
316:
313:
310:
307:
304:
301:
298:
295:
292:
289:
286:
283:
277:
268:
256:
252:
239:
202:Variant records
196:
79:
77:
74:
73:April 1974
17:
12:
11:
5:
1337:
1327:
1326:
1321:
1304:
1303:
1301:
1300:
1294:
1288:
1282:
1276:
1270:
1264:
1258:
1252:
1251:
1246:
1240:
1237:
1236:
1234:
1233:
1227:
1225:
1219:
1218:
1216:
1215:
1210:
1205:
1200:
1195:
1190:
1185:
1180:
1175:
1169:
1167:
1161:
1160:
1157:
1156:
1154:
1153:
1148:
1143:
1138:
1133:
1128:
1123:
1118:
1116:Virtual Pascal
1112:
1110:
1106:
1105:
1103:
1102:
1097:
1092:
1087:
1082:
1077:
1067:
1062:
1057:
1052:
1041:
1039:
1032:
1026:
1025:
1023:
1022:
1017:
1012:
1007:
1002:
997:
992:
987:
981:
979:
973:
972:
964:
963:
956:
949:
941:
933:
932:
925:
904:
893:(2): 199–207.
873:
872:
870:
867:
282:
276:
273:
232:
231:
224:
219:
214:
209:
203:
195:
192:
140:
139:
125:
124:
120:
119:
111:
105:
104:
91:
85:
84:
71:
67:
66:
61:
55:
54:
46:
42:
41:
28:
15:
9:
6:
4:
3:
2:
1336:
1325:
1322:
1320:
1317:
1316:
1314:
1298:
1295:
1292:
1289:
1286:
1283:
1280:
1277:
1274:
1271:
1268:
1265:
1262:
1259:
1254:
1253:
1250:
1247:
1245:
1242:
1241:
1238:
1232:
1229:
1228:
1226:
1224:
1223:Microcomputer
1220:
1214:
1211:
1209:
1206:
1204:
1201:
1199:
1196:
1194:
1191:
1189:
1186:
1184:
1181:
1179:
1176:
1174:
1171:
1170:
1168:
1166:
1162:
1152:
1149:
1147:
1144:
1142:
1139:
1137:
1134:
1132:
1129:
1127:
1126:Borland Kylix
1124:
1122:
1119:
1117:
1114:
1113:
1111:
1107:
1101:
1098:
1096:
1093:
1091:
1088:
1086:
1083:
1081:
1080:PascalABC.NET
1078:
1075:
1071:
1068:
1066:
1063:
1061:
1058:
1056:
1053:
1050:
1046:
1043:
1042:
1040:
1036:
1033:
1031:
1027:
1021:
1018:
1016:
1013:
1011:
1008:
1006:
1003:
1001:
998:
996:
995:Pascal Script
993:
991:
990:Object Pascal
988:
986:
983:
982:
980:
978:
974:
969:
962:
957:
955:
950:
948:
943:
942:
939:
928:
922:
918:
911:
909:
900:
896:
892:
885:
878:
874:
280:
272:
264:
260:
249:
245:
242:
236:
229:
225:
223:
222:Pointer types
220:
218:
217:Packed arrays
215:
213:
210:
207:
204:
201:
200:
199:
191:
189:
185:
181:
180:Niklaus Wirth
177:
172:
170:
169:shared memory
166:
162:
158:
154:
150:
146:
138:
134:
130:
126:
123:Influenced by
121:
118:
115:
112:
110:
106:
103:
99:
95:
92:
90:
86:
72:
68:
65:
62:
60:
56:
53:
50:
47:
43:
40:
36:
32:
29:
27:
23:
1208:Turbo Vision
1131:Turbo Pascal
1121:Apple Pascal
1109:Discontinued
1009:
916:
890:
877:
278:
265:
261:
250:
246:
237:
233:
228:input/output
197:
175:
173:
155:for writing
151:designed by
144:
143:
1141:UCSD Pascal
1070:Free Pascal
1020:SuperPascal
244:statement.
188:interpreter
171:computers.
1313:Categories
1256:Related to
1183:FireMonkey
1151:Pascal/MT+
1146:JRT Pascal
1085:GNU Pascal
1060:VSI Pascal
869:References
230:procedures
39:concurrent
35:structured
31:Imperative
1065:IP Pascal
1030:Compilers
467:procedure
356:procedure
26:Paradigms
1291:Oberon-2
1285:Modula-3
1267:Modula-2
1198:OpenWire
977:Dialects
809:Consumer
797:Producer
692:consumer
608:producer
560:continue
443:continue
257:continue
129:ALGOL 60
109:Platform
1090:Turbo51
1074:Lazarus
1055:Oxygene
1049:history
1038:Current
1005:Clascal
1000:Oxygene
725:Integer
698:process
641:Integer
614:process
488:Integer
374:Integer
344:Boolean
308:Integer
296:Monitor
275:Example
80:1974-04
78: (
1299:(1991)
1293:(1991)
1287:(1988)
1281:(1986)
1279:Oberon
1275:(1983)
1269:(1977)
1263:(1958)
1045:Delphi
985:Pascal
970:family
923:
785:Buffer
710:Buffer
626:Buffer
515:emptyq
449:emptyq
323:emptyq
290:buffer
184:Pascal
137:Pascal
133:Simula
117:PDP 11
98:strong
52:Pascal
45:Family
1261:ALGOL
1015:Joyce
887:(PDF)
815:begin
734:cycle
731:begin
650:cycle
647:begin
596:false
584:begin
566:fullq
551:false
533:saved
509:delay
494:begin
470:entry
407:saved
398:fullq
392:delay
380:begin
359:entry
329:Queue
317:fullq
302:saved
253:delay
147:is a
49:Wirth
921:ISBN
851:pass
845:cons
836:pass
830:prod
821:pass
818:init
803:cons
791:prod
779:pass
749:item
737:pass
719:item
704:pass
671:item
659:pass
635:item
620:pass
587:full
542:full
524:item
506:then
503:full
482:item
434:true
425:full
416:item
389:then
386:full
368:item
338:full
284:type
269:init
255:and
241:init
206:Goto
163:and
135:67,
102:safe
1273:Ada
1203:RTL
1188:LCL
1178:FCL
1173:CLX
1165:API
1100:ACK
895:doi
860:end
776:var
764:end
761:end
743:get
716:var
683:end
680:end
665:put
632:var
599:end
575:end
500:not
479:var
473:get
458:end
362:put
299:var
182:'s
114:DEC
1315::
907:^
889:.
839:),
752:);
713:);
629:);
518:);
497:if
491:);
401:);
383:if
377:);
131:,
100:,
96:,
37:,
33:,
1076:)
1072:(
1051:)
1047:(
960:e
953:t
946:v
929:.
901:.
897::
863:.
854:)
848:(
833:(
824:,
812:;
806::
800:;
794::
788:;
782::
767:;
746:(
740:.
728:;
722::
707::
701:(
695:=
686:;
674:)
668:(
662:.
644:;
638::
623::
617:(
611:=
602:;
593:=
590::
578:;
569:)
563:(
554:;
548:=
545::
536:;
530:=
527::
512:(
485::
476:(
461:;
452:)
446:(
437:;
431:=
428::
419:;
413:=
410::
395:(
371::
365:(
347:;
341::
332:;
326::
320:,
311:;
305::
293:=
82:)
Text is available under the Creative Commons Attribution-ShareAlike License. Additional terms may apply.