Page 64 - 6571
P. 64

Процеси  Producer  і  Consumer  повинні  отримувати  доступ
                  до  змінної  buf  по  черзі.  Спочатку  Producer  поміщає  перший
                  елемент  з  масиву  a  в  змінну  buf,  потім  Consumer  витягує  її  із

                  змінної buf, після чого Producer поміщає в змінну buf наступ-
                  ний елемент з масиву a і так далі. Нехай спільні змінні p та c ви-
                  ступають лічильниками числа поміщених і витягнутих елементів.

                  Їхні початкові значення дорівнюють 0. Тоді умови для синхроні-
                  зації процесів Producer і Consumer можуть бути записані в на-
                  ступному вигляді:

                        PC: c<= p<= c+1

                        Значення змінних c та p можуть відрізнятися не більше ніж

                  на  1.  Це  означає,  що  Producer  помістив  у  буфер  максимум  на
                  один елемент більше, ніж Consumer витягнув. Код цих двох про-
                  цесів приведений в лістингу 2.


                        Лістинг 2 – Копіювання масиву від «виробника» до «спожи-
                  вача»

                        int buf, p = 0, c = 0;
                        process Producer {
                          int a[n];
                          while (p <n) {
                            < await (p == c);>
                            buf = a[p];
                            p = p+1;
                          }
                        }
                        process Consumer {
                          int b[n];
                          while (c <n) {
                            < await (p> c);>
                            b[c] = buf;

                            c = c+1;
                          }
                        }

                        Процеси Producer і Consumer використовують змінні p та c
                  для синхронізації доступу до буфера buf.  Оператори await за-
                  стосовуються для призупинення процесів до тих пір, поки буфер

                  не стане повним або порожнім. Якщо умова p == c істинна, то



                                                              63
   59   60   61   62   63   64   65   66   67   68   69