|
|
||
6. Примитивы синхронизации |
||
Примитивом синхронизации называется программное средство высокого уровня для решения задач синхронизации. Обычно примитивы синхронизации реализованы как объекты ядра операционной системы, которые предназначены для решения задач синхронизации потоков и процессов. В пользовательских программах доступ к примитивам синхронизации выполняется или посредством вызова функций, которые работают с объектами синхронизации, или при помощи специальных инструкций, которые встроены в язык программирования. Часто языки программирования, в которые встроены объекты синхронизации, называются языками системного программирования. Мы рассмотрим реализацию примитивов синхронизации только для случая однопроцессорных систем. Поэтому непрерывность действий будем обеспечивать запрещением прерываний. |
||
| class Thread { /* ... */ };
// класс потоков class ThreadQueue // класс очередей потоков { Thread* tp; // список потоков void IncludeThreadToList(Threads t); // включить поток в список Threads ExcludeThreadFromList(); // исключить поток из очереди void SuspendThread(Threads t); // заблокировать поток void ResumeThread(Threads t) ; // разблокировать поток public: ThreadQueue(): tp(NULL) {} // конструктор ~ThreadQueue() { /* очищаем список потоков */ } // деструктор void EnqueueThread(Threads t) { IncludeThreadToList(t) ; SuspendThread(t); } bool DequeueThread() // исключить поток из очереди { if(tp == NULL) return false; else { ResumeThread(ExcludeThreadFromList{)); return true; } } }; |
||
Теперь можно перейти к реализации примитивов синхронизации. Рассмотрим реализацию только двух примитивов синхронизации: condition (условие) и semaphore (семафор), наиболее часто встречающихся на практике. Другие примитивы синхронизации могут быть реализованы подобным им образом. После реализации этих примитивов покажем, как они могут применяться для решения задач синхронизации параллельных потоков. |
||
6 |