Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

volatile (программистское)

Наткнулся на старую статью Александреску о том, как можно использовать ключевое слово volatile с объектами (а не примитивными значениями, как обычно) в C++, для того, чтобы лучше многопоточные программы писать.

Интересная техника! Но любопытно то, что Александреску нигде не отмечает, насколько предлагаемое им использование слова volatile не зависит, на самом деле, от его "смысла". Пусть меня поправят, если я неправ, но мне кажется, что предлагаемое автором использование volatile только при определении объектов, а также полей и методов классов, которые могут без опаски быть использованы одновременно разными потоками - тут volatile вообще ничего не делает с точки зрения компилируемого кода (volatile может что-то делать при использовании с примитивными типами, но как раз этого Александреску советует не делать, а заворачивать их в таких случаях в объекты!).

Иными словами, то, что нужно, это некое абстрактное ключевое слово foobaric, так чтобы: а) любой объект можно было объявить foobaric; б) в таком случае его члены автоматически становятся foobaric; в) метод класса можно было объявить foobaric; г) foobaric-объект может вызывать только foobaric-методы своего класса; д) от объекта можно отобрать его foobaric-сущность каким-нибудь приведением.

Если у нас есть такой foobaric, то мы можем сделать умный указатель а-ля Александреску, который все время своей жизни проводит внутри мьютекса, и переводит вызовы foobaric-объекта, которым был инициализирован, в вызовы того же объекта без foobaric, который он сохранил внутри путем приведения.

Александреску делает это при помощи foobaric==volatile, но это не использует ничего из "настоящей" семантики volatile, а просто применяет volatile в качестве такого foobaric-маркера. Можно было бы, например, в качестве foobaric использовать const и mutable (для методов), но тогда "настоящая" семантика const мешалась бы под ногами. Сам факт того, что для решения этой проблемы пришлось "позаимствовать" вообще-то предназначенное для другого (хоть на первый взгляд и родственного) слово volatile, указывает на то, что, возможно, стоит иметь гибкую поддержку такого рода "маркеров" прямо в языке. И тут, видимо, мне самое время прочитать статьи про Traits, которые недавно бросил в закладки, но пока не добрался...

Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 49 comments