yigal_s: (Default)
yigal_s ([personal profile] yigal_s) wrote2011-11-10 06:52 pm

(no subject)

Внезапно осознал, что совсем практически себе не представлял, что оптимизатор может делать, а что не может, работая с константной ссылкой (равно как и с указателем на константу) в С++.

Скажем, если мы будем в цикле локать мютекс из pthreads и проверять значение, на который указывает указатель на константу, далее отпуская мютекс и снова начиная тело цикла с начала -- есть ли у нас гарантия, что мы увидим изменение этого значения из-под другого треда, или же компилятор выпилит все проверки кроме первой?

Вообще-то говоря, такие вещи надо бы знать идеально. Это даже не таинственного мультитредного С++ касается, который вот уже полтора десятка лет живёт без всякой стандартизации, а и вполне обычного стандартизированного однотредного С++, где мы можем из-под выше описываемого цикла вызывать заодно и какую-то внешнюю функцию без аргументов, меняющую значение переменной, на которую у нас есть константый указатель. Надо бы мне это знать. А вот нет. Как-то проскочил мимо, или же знал, но давно позабыл.

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

"не является сама по себе основанием для каких-то дополнительных оптимизаций" -- если у кого-то есть возражения или комментарии по этому поводу, равно как и вообще, буду рад обсудить.

[identity profile] mediant.livejournal.com 2011-11-14 05:05 am (UTC)(link)
в соответствии с вышеизложенным спеком, функция f1 может никогда не окончиться. )))

хочешь казуистики, гад? держи: функция обязана завершиться независимо от работы оптимизатора, иначе не завершится программа и не сможет вернуть exit code, а это observable behavior.

Не говоря уже о том, что нарушается та самая sequence of reads and writes to volatile data and calls to library I/O functions.

Но заметь, что по факту это никого особо не колыхало и как в unix, так и в windows можно было писать вполне рабочие программы (учитывая определенное сотрудничество разработчиков библиотек синхронизации и разработчиков компиляторов). Ну да, совершенно вне стандарта, ну так и что?

да блин, не в стандарте же проблема, и не в том, что можно даже, а в том, как поздно это осознается. столько всего лично нами написано - и не факт что оно "рабочее".

[identity profile] mediant.livejournal.com 2011-11-14 03:59 pm (UTC)(link)
На самом деле, у нас наоборот была очень пессимистичная стратегия работы с атомикс, мы ставили мембары в куче мест, где без них можно было бы, возможно, и обойтись.

я даже знаю, благодаря кому :) вот вопрос и возникает - как корректно писать без тяжелых интерлоков.

офф - про keyed events (http://locklessinc.com/articles/keyed_events/) читал?

[identity profile] mediant.livejournal.com 2011-11-15 05:37 am (UTC)(link)
очевидно на handles экономили, non-paged pool соответственно и всякое такое.

вот, нашлось:
http://www.bluebytesoftware.com/blog/PermaLink,guid,db9f8f5b-8d1d-44b0-afbd-3eadde24b678.aspx

[identity profile] mediant.livejournal.com 2011-11-15 09:55 am (UTC)(link)
странное решение. программа всё равно со временем имеет шансы постепенно заллоцировать все events, переполнить таблицу хендлов и упасть.

пишут же, что собрали статистику, уж наверное толк был.

ты наверное не понял - аллокация происходит in response to the first contended acquire, то есть захват свободной critical section до поры до времени происходит бездвоздмездно, то есть даром.

очень может быть, что "на тот момент и при том контингенте программистов" ;) это была ни фига себе оптимизация.

[identity profile] mediant.livejournal.com 2011-11-15 03:22 pm (UTC)(link)
тогда можно уж и память каждой программе преаллоцировать сразу гиг или два, все равно ведь может понадобиться?

понимаешь, есть такое мнение, что lazy resource acquisition leads to better scalability. это как раз тот случай.