ふと表題のような疑問を思いついたので、実験してみることにした。
おそらく、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内のスレッドを止めてくれているようだ。