Delphi. Критические секции. Некоторые простые наблюдения

Построил простой, классический пример из 2-х потоков.

Вот так потоки синронизированы и работают последовательно

6

Вот так потоки не синхронизированы и они пишут в Memo беспорядочно

7

Вот наша процедура в главном модуле, которая будет писать в Memo

Нам также понадобятся 2 отдельных модуля с классами потоков, примерно так…

8

В главном модуле, мы будем запускать наши потоки следующим образом

А теперь, собственно наблюдения

Наблюдение 1 – потоки работают последовательно, если они синхронизированы и нужный код обернут в критическую секцию

Вот так правильно – потоки работают правильно

Вот так неправильно, хоть код и обернут в критическую секцию

Наблюдение 2 – потоки работают последовательно если  обернуть в критическую секцию “конечный код”

В нашем примере это означает вот что…

 

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

Наблюдение 3 – потоки работают беспорядочно в любом другом случае

Например, если мы не синхронизируем там, где это нужно сихнронизировать

Либо если даем критической секции локальное время жизни

Но, наверное это далеко не все нюансы. Просто некоторые наблюдения.

 

Добавить комментарий