<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: Опасная функция ExitProcess.</title>
	<atom:link href="http://blog.not-a-kernel-guy.com/2007/07/15/210/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.not-a-kernel-guy.com/2007/07/15/210</link>
	<description>... in the Windows kernel team</description>
	<pubDate>Thu, 20 Nov 2008 20:20:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: Not a kernel guy : Blog Archive : Продолжение истории про ExitProcess.</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8132</link>
		<dc:creator>Not a kernel guy : Blog Archive : Продолжение истории про ExitProcess.</dc:creator>
		<pubDate>Thu, 19 Jul 2007 06:21:39 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8132</guid>
		<description>[...] История про ExitProcess получила несколько неожиданное продолжение. Оказалось, что для того, чтобы избежать блокировки на критической секции, захваченной другим потоком во время ExitProcess, в функцию EnterCriticalSection был добавлен код, обрабатывающий эту ситуацию. Начиная с Windows XP EnterCriticalSection проверяет захвачена ли секция и, в случае если захвачена, сверяет идентификатор текущего потока с идентификатором захватчика. А вот дальнейшее поведение зависит от версии операционной системы. [...]</description>
		<content:encoded><![CDATA[<p>[...] История про ExitProcess получила несколько неожиданное продолжение. Оказалось, что для того, чтобы избежать блокировки на критической секции, захваченной другим потоком во время ExitProcess, в функцию EnterCriticalSection был добавлен код, обрабатывающий эту ситуацию. Начиная с Windows XP EnterCriticalSection проверяет захвачена ли секция и, в случае если захвачена, сверяет идентификатор текущего потока с идентификатором захватчика. А вот дальнейшее поведение зависит от версии операционной системы. [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Konstantin</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8130</link>
		<dc:creator>Konstantin</dc:creator>
		<pubDate>Tue, 17 Jul 2007 16:49:46 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8130</guid>
		<description>http://blogs.msdn.com/oldnewthing/archive/2007/05/03/2383346.aspx

Тут вроде товарищ Чен написал, что после вызова ExitProcess все вызовы EnterCriticalSection срабатывают.</description>
		<content:encoded><![CDATA[<p><a href="http://blogs.msdn.com/oldnewthing/archive/2007/05/03/2383346.aspx" rel="nofollow">http://blogs.msdn.com/oldnewthing/archive/2007/05/03/2383346.aspx</a></p>
<p>Тут вроде товарищ Чен написал, что после вызова ExitProcess все вызовы EnterCriticalSection срабатывают.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8127</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Mon, 16 Jul 2007 22:40:06 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8127</guid>
		<description>&#160;&lt;blockquote&gt;&lt;blockquote&gt;Если EnterCriticalSection, то это user mode синхропримитив и должен корректно отваливаться при завершении процесса. Или имеется ввиду CreateMutex?&lt;/blockquote&gt;

Я имею ввиду CriticalSection и все остальные примитивы кроме Mutex.&lt;/blockquote&gt;

Хе-хе. Всё оказалось даже интереснее. Специально для этого случая в EnterCriticalSection добавили проверку. Расскажу об этом подробнее отдельным постом.</description>
		<content:encoded><![CDATA[<p>&nbsp;<br />
<blockquote>
<blockquote>Если EnterCriticalSection, то это user mode синхропримитив и должен корректно отваливаться при завершении процесса. Или имеется ввиду CreateMutex?</p></blockquote>
<p>Я имею ввиду CriticalSection и все остальные примитивы кроме Mutex.</p></blockquote>
<p>Хе-хе. Всё оказалось даже интереснее. Специально для этого случая в EnterCriticalSection добавили проверку. Расскажу об этом подробнее отдельным постом.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8126</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Mon, 16 Jul 2007 17:31:34 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8126</guid>
		<description>&#160;&lt;blockquote&gt;Может я чего-то не понимаю, но мне кажется в первом предложении ошибка, должно быть “какая из 2-х функций опаснее”…&lt;/blockquote&gt;

Точно. Поправил.</description>
		<content:encoded><![CDATA[<p>&nbsp;<br />
<blockquote>Может я чего-то не понимаю, но мне кажется в первом предложении ошибка, должно быть “какая из 2-х функций опаснее”…</p></blockquote>
<p>Точно. Поправил.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: max404</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8125</link>
		<dc:creator>max404</dc:creator>
		<pubDate>Mon, 16 Jul 2007 17:19:48 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8125</guid>
		<description>Может я чего-то не понимаю, но мне кажется в первом предложении ошибка, должно быть "какая из 2-х функций опаснее"...</description>
		<content:encoded><![CDATA[<p>Может я чего-то не понимаю, но мне кажется в первом предложении ошибка, должно быть &#8220;какая из 2-х функций опаснее&#8221;&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vladimir Scherbina</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8124</link>
		<dc:creator>Vladimir Scherbina</dc:creator>
		<pubDate>Mon, 16 Jul 2007 15:55:51 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8124</guid>
		<description>&#62;&#62;Они, видимо, не пользуются стандартной C runtime library. Или завершают основной поток минуя runtime library.</description>
		<content:encoded><![CDATA[<p>&gt;&gt;Они, видимо, не пользуются стандартной C runtime library. Или завершают основной поток минуя runtime library.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8123</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Mon, 16 Jul 2007 15:37:28 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8123</guid>
		<description>&#160;&lt;blockquote&gt;Я вот только одного не понимаю: а как тогда не рушатся приложения, которые завершили поток функции main, но у которых продолжают работать порожденные потоки? Ситуация, возможно, не очень типичная, но я вроде никаких глюков в таких случаях не встречал….&lt;/blockquote&gt;

Они, видимо, не пользуются стандартной C runtime library. Или завершают основной поток минуя runtime library.</description>
		<content:encoded><![CDATA[<p>&nbsp;<br />
<blockquote>Я вот только одного не понимаю: а как тогда не рушатся приложения, которые завершили поток функции main, но у которых продолжают работать порожденные потоки? Ситуация, возможно, не очень типичная, но я вроде никаких глюков в таких случаях не встречал….</p></blockquote>
<p>Они, видимо, не пользуются стандартной C runtime library. Или завершают основной поток минуя runtime library.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8122</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Mon, 16 Jul 2007 15:16:55 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8122</guid>
		<description>&#160;&lt;blockquote&gt;Если EnterCriticalSection, то это user mode синхропримитив и должен корректно отваливаться при завершении процесса. Или имеется ввиду CreateMutex?&lt;/blockquote&gt;

Я имею ввиду CriticalSection и все остальные примитивы кроме Mutex. 

&lt;pre&gt;&lt;code class="cpp"&gt;void access_global_data()
{
    // 1. thread_a захватывает секцию cs
    // 4. thread_b пытается захватить секцию cs, которую никогда 
    //    не освободит thread_a
    EnterCriticalSection(&#038;cs);
    
    // thread_b вызывает ExitProcess
    ...
    LeaveCriticalSection(&#038;cs);
}

BOOL WINAPI DllMain(
    HINSTANCE instance,
    DWORD reason,
    LPVOID reserved
    )
{
    switch (reason)
    {
    case DLL_PROCESS_DETACH:
        // 3. ExitProcess уведомляет о завершении процесса каждую из 
        //    загруженных библиотек DllMain(DLL_PROCESS_DETACH)
        access_global_data();
        break;
    }
    
    return TRUE;
}

void thread_a()
{
    access_global_data();
}

void thread_b()
{
    // 2. thread_b пытается завершить процесс. ExitProcess убивает thread_a.
    ExitProcess(0);
}&lt;/code&gt;&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>&nbsp;<br />
<blockquote>Если EnterCriticalSection, то это user mode синхропримитив и должен корректно отваливаться при завершении процесса. Или имеется ввиду CreateMutex?</p></blockquote>
<p>Я имею ввиду CriticalSection и все остальные примитивы кроме Mutex. </p>
<pre><code class="cpp">void access_global_data()
{
    // 1. thread_a захватывает секцию cs
    // 4. thread_b пытается захватить секцию cs, которую никогда
    //    не освободит thread_a
    EnterCriticalSection(&#038;cs);

    // thread_b вызывает ExitProcess
    ...
    LeaveCriticalSection(&#038;cs);
}

BOOL WINAPI DllMain(
    HINSTANCE instance,
    DWORD reason,
    LPVOID reserved
    )
{
    switch (reason)
    {
    case DLL_PROCESS_DETACH:
        // 3. ExitProcess уведомляет о завершении процесса каждую из
        //    загруженных библиотек DllMain(DLL_PROCESS_DETACH)
        access_global_data();
        break;
    }

    return TRUE;
}

void thread_a()
{
    access_global_data();
}

void thread_b()
{
    // 2. thread_b пытается завершить процесс. ExitProcess убивает thread_a.
    ExitProcess(0);
}</code></pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Vladimir Scherbina</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8120</link>
		<dc:creator>Vladimir Scherbina</dc:creator>
		<pubDate>Mon, 16 Jul 2007 10:33:39 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8120</guid>
		<description>Идеально конечно же через PostThreadMessage нотифицировать потокам о завершении, ждать пока хендлы потоков засигналятся и только тогда завершать процесс.</description>
		<content:encoded><![CDATA[<p>Идеально конечно же через PostThreadMessage нотифицировать потокам о завершении, ждать пока хендлы потоков засигналятся и только тогда завершать процесс.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: AlexWWolf</title>
		<link>http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8119</link>
		<dc:creator>AlexWWolf</dc:creator>
		<pubDate>Mon, 16 Jul 2007 08:55:16 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/07/15/210#comment-8119</guid>
		<description>Я вот только одного не понимаю: а как тогда не рушатся приложения, которые завершили поток функции main, но у которых продолжают работать порожденные потоки? Ситуация, возможно, не очень типичная, но я вроде никаких глюков в таких случаях не встречал....</description>
		<content:encoded><![CDATA[<p>Я вот только одного не понимаю: а как тогда не рушатся приложения, которые завершили поток функции main, но у которых продолжают работать порожденные потоки? Ситуация, возможно, не очень типичная, но я вроде никаких глюков в таких случаях не встречал&#8230;.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
