Эта проблема в общем случае не решается статическим анализом. Максимум что можно сделать -- заставить программистов соблюдать всякие соглашения, позволяющие частично избежать ошибок.
Нет, я не имею таких полномочий. Я сообщаю свою позицию, сформировавшуюся на основе некоторого опыта поиска гонок и участия в разработке соответствующих инструментов.
Кстати, с академической точки зрения было бы интересно послушать про формализм, позволяющий гарантированно находить ошибки синхронизации без ложных срабатываний, не вносящий дополнительных проблем (как, например, ключевое слово synchronized в Java, которое может привести к дедлокам -- тоже, кстати, в общем случае не детектируемым статически) и не сериализующий всех потоков с помощью одного глобального ресурса.
Это все совершенно правильно и что? Использование volatile необходимо в тех случаях, когда DMA например или еще какие методы внешнего воздействия на состояние памяти.
В обычном программировании, можно обойтись, в embedded - часто невозможно.
В известной статье Joel Spolsky писал, что "for some reason most people seem to be born without the part of the brain that understands pointers" - я обсуждал это как-то с коллегой, который по образованию EE, и он сказал, что точно так же многие не могут заниматься multithreaded programming, потому что не могут представлять программу в time domain. В лучше случае, они осваивают использование мьютексов как магических амулетов.
Спольский считает, что проблема - в использовании в обучении Java - раньше неспособные к поинтерам отсеивались прямо на первом курсе, когда начинали изучать C, а теперь могут дотянуть до диплома. Мой коллега говорил, что для выявления неспособных к multithreading хорошо помогает курс электроники.
Я полагаю, подобные курсы электроники и повлияли на создателей примитива синхронизации Event в Win32. Весьма разумная штука с точки зрения электронщика, и... довольно бесперспективная для программирования.
This is because multi-threading is human-unfriendly approach to concurrency. Actor model, e.g., is much easier to reason about -- at least, actors are composable.
no subject
Date: 2011-10-10 08:53 am (UTC)no subject
Date: 2011-10-10 09:00 am (UTC)no subject
Date: 2011-10-10 09:21 am (UTC)неужели у вас эту проблему еще не решили статическим анализом?
no subject
Date: 2011-10-10 09:36 am (UTC)no subject
Date: 2011-10-10 09:42 am (UTC)no subject
Date: 2011-10-10 09:42 am (UTC)А вот без volatile результаты бывают интересные... и непредсказуемые...
no subject
Date: 2011-10-10 09:57 am (UTC)no subject
Date: 2011-10-10 11:31 am (UTC)Кстати, с академической точки зрения было бы интересно послушать про формализм, позволяющий гарантированно находить ошибки синхронизации без ложных срабатываний, не вносящий дополнительных проблем (как, например, ключевое слово synchronized в Java, которое может привести к дедлокам -- тоже, кстати, в общем случае не детектируемым статически) и не сериализующий всех потоков с помощью одного глобального ресурса.
no subject
Date: 2011-10-10 12:24 pm (UTC)http://www.mjmwired.net/kernel/Documentation/volatile-considered-harmful.txt
no subject
Date: 2011-10-10 12:33 pm (UTC)no subject
Date: 2011-10-10 12:35 pm (UTC)no subject
Date: 2011-10-10 12:43 pm (UTC)Использование volatile необходимо в тех случаях, когда DMA например или еще какие методы внешнего воздействия на состояние памяти.
В обычном программировании, можно обойтись, в embedded - часто невозможно.
no subject
Date: 2011-10-10 12:46 pm (UTC)no subject
Date: 2011-10-10 12:48 pm (UTC)Спольский считает, что проблема - в использовании в обучении Java - раньше неспособные к поинтерам отсеивались прямо на первом курсе, когда начинали изучать C, а теперь могут дотянуть до диплома. Мой коллега говорил, что для выявления неспособных к multithreading хорошо помогает курс электроники.
Мне кажется, что в этом есть смысл.
Недавно на похожую тему писал
no subject
Date: 2011-10-10 01:06 pm (UTC)no subject
Date: 2011-10-10 06:22 pm (UTC)This is because multi-threading is human-unfriendly approach to concurrency
Date: 2011-10-11 12:40 am (UTC)no subject
Date: 2011-10-26 08:43 pm (UTC)