Шрифт:
Проблема этой программы заключается в том, что она рассчитывала на то, что ввод текста из программы продлится так долго, что у другого потока хватит времени для подсчета символов до того, как поток
Этот пример показывает, как аккуратны вы должны быть с временными условиями в многопоточных программах. Исправить программу можно, применяя дополнительный семафор для того, чтобы заставить поток
Синхронизация с помощью мьютексов
Другой способ синхронизации доступа в многопоточных программах — применение мьютексов (сокращение от mutual exclusions — взаимные исключения) или исключающих семафоров, которые разрешают программистам "запирать" объект так, что только один поток может обратиться к нему.
Базовые функции, необходимые для использования мьютексов, очень похожи на функции семафоров. Они объявляются следующим образом:
Как обычно, в случае успешного завершения возвращается 0 и код ошибки в случае аварийного завершения, но переменная
Как и функции семафоров, функции мьютексов принимают указатель на предварительно объявленный объект, в данном случае типа
Установка атрибутов мьютекса в этой книге не рассматривается, поэтому мы будем передавать
Выполните упражнение 12.4.
Далее приводится еще одна модификация исходной программы thread1.с, но значительно измененная. На этот раз вы уделите особое внимание доступу к вашим важным переменным и примените мьютекс для того, чтобы быть уверенными в том, что они доступны в любой момент времени только одному потоку. Для легкости чтения текста примера мы пропустили некоторые проверки ошибок при возвратах из мьютекса, заблокированного и открытого. В рабочем программном коде вы обязательно должны проверять эти возвращаемые значения. Далее приведен текст новой программы thread4.c.