Защита данных в многопоточных приложениях Print E-mail

Самая важная часть вашей программы — код управления данными. Если данные повреждены, то вся ваша программа абсолютно бесполезна. Достаточно просто убедится в том, что однопоточное приложение случайно не повредит данные. Совсем другая история с многопоточными приложениями.

Проблема перекрытия

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

Будем передавать структуру app_data в поток, который читает данные и использует переменные a и b 100 раз, когда a равно пяти. Будем использовать локальную переменную «use», чтобы отсчитать 100 использований. Также будем увеличивать «use_count» ( допустим, если вам надо считать количество обращений к данным ). Добавим небольшую паузу ( usleep ), чтобы дать планировщику запустить и другие потоки.

Теперь напишем код, изменяющий данные. Будем продолжать изменять a и b до тех пор, пока они не будут использованы в других потоках (в данном случае user_thread) 100 раз. Изменения несложные: будем «переключать» значение переменной a между 5 и 50 и создавать ложные трудоемкие вычисления переменной b — поставим usleep (1000). (usleep всегда возвращает 0, если компьютер исправен.). Это значит, что изменится a, а через одну миллисекунду изменится b. Получается промежуток времени в одну миллисекунду, во время корогого a и b не должны использоваться нигде в приложении, поскольку они еще не приняли тех значений

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