September 15th, 2011

Hello computer!

синхронизация

     На работе пишем счётную программу, обсчитывающую нечто в двух нитях. Нити должны быть синхронизованы - одна не должна обгонять другую. Сделали так: ("псевдокод" на Си):
volatile int lock;

main()
{
 lock=0;
 create_thread(&thread1);
 create_thread(&thread2);
 {ждём и время от времени рисуем графики}
}


thread1()
{
while(1)
 {
  {что-то считаем}
  lock++;
  while(lock==1);
  lock=0;
 }
}

thread2()
{
while(1)
 {
  {что-то считаем}
  lock++;
  while(lock==1);
  lock=0;
 }
}

     Идея ясна: первая нить, досчитав, увеличивает lock, он становится равен 1, нить встаёт в цикл while и ждёт. Вторая нить, досчитав, увеличивает lock, он становится равен 2, нить сбрасывает lock в 0 и идёт на второй круг, первая нить, увидев 0, тоже идёт считать дальше. При желании это легко масштабируется на N нитей, заменой while(lock==1); на while(lock!=0 && lock!=N);. Да, я понимаю. что while(); грузит ядро на 100% - но разница в скорости работы нитей небольшая, да и ядро это всё равно простаивало бы, в ожидании соседней нити. Да, я знаю что "системными функциями было бы надёжнее", но нити крутятся очень быстро, вызывать относительно тяжеловесные системные функции как-то не хочется, такой вот spinlock побыстрее будет.
     Так вот. После нескольких десятков-сотен тысяч "оборотов" обе нити "зависают". Зависают в while(lock==1);. Почему - я так и не понял, volatile вроде не забыл, "гонок" я не вижу. Кто-нибудь может понять, на какие грабли мы тут наступили? Компилятор - какой-то не очень свежий borland C++ builder, какой точно - на работе посмотрю, навскидку не помню.
     Вопрос сейчас уже теоретический - блокировку переписали по другому, "так что работает", а поскольку задача счётная и "для себя", то и пофиг, лишь бы работало. Но чисто теоретически - какого фига? Что тут может быть, lock++ на самом деле неатомарный, или я гонки где-то не заметил?...
серая инкогнита - танцует

электроправительство

     1) «Известная актриса Скарлетт Йохансон (Scarlett Johansson) стала жертвой хакеров, которые украли ее обнаженные фотографии с мобильного телефона - [конкретно речь идёт об iPhone] - и выложили в сеть»
     (via d3, осторожно - ню!)

     2) «Мы разрабатываем электронный документооборот как компонент одной из систем электронного правительства. Электронное правительство, вопреки расхожему мнению, это не название системы и не сайт «Госуслуги», а способ взаимодействия ветвей государственной власти между собой и с гражданами. Наш документооборот существует с 2005 года и используется, в настоящее время, в Татарстане и Москве. [...] Все законопроекты, распоряжения, указания и так далее теперь движутся только в недрах системы, воплощаясь в бумагу только в тех случаях, когда взаимодействовать приходится с ведомствами, не подключенными к документообороту. [...] Используется три типа клиентских приложений, это веб-клиент, работающий из-под любого браузера, клиент для Айпада и клиент для тач-ноутов на базе Виндоуз. Последний используется всё реже и постепенно уходит в историю — его разрабатывали в те времена, когда Айпада ещё не было. Поскольку iOS более подходит под управление пальцем, да и весит Айпад меньше, чем тач-ноутбук, то вытеснение первых вторыми происходит с хорошей скоростью. На скриншоте выше — экран логина клиента под Айпад»
     (c) Евгений Степанищев at bolknote

     ...так во-от зачем нашему нанопрезиденту айпод! Он в нём не только твиты твитит, но и натурально может законопроекты подписывать - электронной подписью стилусом по дисплею!
     Ждём электронного взлома электронного правительства (Скарлетт Йохансон взломали же, а тут айпадов много, хоть один да откроется), и совершения какой-нибудь фигни :-) Скажем, принятия законопроекта, легализующего пиратство и педофилию :-)

     Шутка, да.