DLL内で立てたスレッドは、アタッチ先のプロセスが終了したらどうなるか?

投稿者: | 2011年9月3日

ふと表題のような疑問を思いついたので、実験してみることにした。
おそらく、OSが面倒を見てスレッドを止めてくれると思うのだが・・・。
※なお、環境はWindowsXPで、VisulaStudio2005で作成、ビルドした。

まずはdllのコードをCで書いてみる。

MyDll.cpp

#include <windows.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
    return TRUE;
}


DWORD WINAPI ThreadProc(LPVOID lpParam)
{
	while(TRUE)
	{
		Beep(440,100);
		Sleep(1000);
	}
}

extern "C" __declspec(dllexport) void __stdcall NewThread()
{	
	DWORD dwThreadId;
	HANDLE hThread = CreateThread(NULL,0,ThreadProc,NULL,0,&dwThreadId);
}

20行目のNewThread()という関数は.NETから呼び出されることを想定している。
この関数が呼ばれると、スレッドが起動する。スレッドの処理は11-18行目に記述されている。無限ループ内で1秒ごとにBeep音を鳴らすだけの処理である。本来はスレッド内に無限ループを書いたりするのは作法の悪い書き方だが、実験のため、あえて無限ループにしている。
それでは次に、このdllの呼び出し側のプログラムを示す。こちらはC#で書いている。

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace DllUser
{
    public partial class Form1 : Form
    {
        [DllImport("MyDll")]
        private static extern void NewThread();

        public Form1()
        {
            InitializeComponent();
        }

        // Windowsフォーム アプリケーション
        // プロジェクト初期状態のフォームにボタンを一つ追加し、
        // そのクリックイベントハンドラからプログラムは開始する。
        private void button1_Click(object sender, EventArgs e)
        {
            NewThread();
        }
    }
}

このプログラムを起動し、ボタンを押すと、dllのNewThread()関数が呼ばれる。
それによってdll内でスレッドが立ち上がり、1秒おきにBeep音が鳴り始める。
そして、ウィンドウを閉じるとBeep音も止まった。
このことから、予想通りアタッチ先のプロセスが終了した段階でOSがdll内のスレッドを止めてくれているようだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です