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