<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Авто Мутексы и return</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9252.html</link>
    <description>Здравствуйте. &lt;br&gt;Подскажите, пожалуйста.&lt;br&gt;&lt;br&gt;Написал полуАвтоматический класс-оболочку для мутексов. Через деструктор в конце области действия мутекс освобождается.  Возникли сомнения по поводу return в том, что произойдет в начала:&lt;br&gt;1) вызов деструктора, а потом копирование protected_variable&lt;br&gt;2) или же в начале произойдет копирование, потому вызов деструктора.&lt;br&gt;3) стандарт не гарантирует поведение.&lt;br&gt;&lt;br&gt;Почти уверен, что второй вариант, но закрались сомнения и не хочу неприятных сюрпризов. &lt;br&gt;Пример:&lt;br&gt;&lt;br&gt;int get_var()&#123;&lt;br&gt;AutoMutex autoX;&lt;br&gt;autoX.lockread();&lt;br&gt;return protected_variable;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Спасибо.&lt;br&gt;</description>

<item>
    <title>Авто Мутексы и return (Fx)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9252.html#2</link>
    <pubDate>Sat, 08 Oct 2011 09:26:03 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt; int get_var()&#123; &lt;br&gt;&amp;gt;&amp;gt; AutoMutex autoX; &lt;br&gt;&amp;gt;&amp;gt; autoX.lockread(); &lt;br&gt;&amp;gt;&amp;gt; return protected_variable; &lt;br&gt;&amp;gt;&amp;gt; &#125; &lt;br&gt;&amp;gt;&amp;gt; Спасибо.&lt;br&gt;&amp;gt; Почему бы не поднять ваш RAII объект для мутекса на уровень выше? &lt;br&gt;&amp;gt; Ведь сейчас, в данном коде, возвращаемое значение в любом случае не &lt;br&gt;&amp;gt; будет гарантированно актуальным. Ничто не мешает другому потоку обновить значение глобальной &lt;br&gt;&amp;gt; переменной сразу по освобождению мутекса, до присвоения значения, полученного в get_var(). &lt;br&gt;&lt;br&gt;Спасибо за ответ и за замечание. Хм, еще раз все обдумал, я как раз ушел от уровня выше, потому что get_var() - функция класса, а на уровне выше часто пришлось бы в функциях других классов вызывать через указатель мутекс объекта с которым работаю в данный момент. Показалось не элегантным из-за &lt;br&gt;1) того что плодяться лишние строки кода, каждый раз приходится блокировать мутекс и думать о нем.&lt;br&gt;2) можно забыть поставить мутекс (другой пользователь класса забудет, например:) хотя таких нет, но вдруг )&lt;br&gt;3) излишнее время блокировки мутекса, есл</description>
</item>

<item>
    <title>Авто Мутексы и return (Вова)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/9252.html#1</link>
    <pubDate>Sat, 08 Oct 2011 05:15:58 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; 3) стандарт не гарантирует поведение.&lt;br&gt;&amp;gt; Почти уверен, что второй вариант, но закрались сомнения и не хочу неприятных &lt;br&gt;&amp;gt; сюрпризов.&lt;br&gt;&amp;gt; Пример: &lt;br&gt;&amp;gt; int get_var()&#123; &lt;br&gt;&amp;gt; AutoMutex autoX; &lt;br&gt;&amp;gt; autoX.lockread(); &lt;br&gt;&amp;gt; return protected_variable; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; Спасибо.&lt;br&gt;&lt;br&gt;Оптимизация кода, описанная в 1) явно противоречила бы стандарту с++, если бы protected_variable была типа &apos;automatic storage duration&apos;.&lt;br&gt;&lt;br&gt;Подробно тут: &lt;br&gt;http://stackoverflow.com/questions/2196327/c-destructor-function-call-order&lt;br&gt;&lt;br&gt; В данном случае, так как protected_variable глобальна, то это условие нарушено. Но, тем не менее, как пишут здесь:&lt;br&gt; &lt;br&gt;http://stackoverflow.com/questions/5999449/llvm-generating-cleanup-destructors-before-function-return/5999592#5999592&lt;br&gt;&lt;br&gt;вначале возвращаемое значение кладётся на стек, затем только выполняются локальные деструкторы.&lt;br&gt;&lt;br&gt;&lt;br&gt;Почему бы не поднять ваш RAII объект для мутекса на уровень выше? Ведь сейчас, в данном коде, возвращаемое значение в любом случае не будет гарантированно актуаль</description>
</item>

</channel>
</rss>
