マネージドスレッドのアンマネージドスレッドの ID を取得する

 取得方法は排他制御(lock ステートメント)を使ってサブスレッドの ID を取得する。

■コード(.CS)

    // サブスレッド
    Thread m_SubThread;
 
    // サブスレッドの ID
    uint m_SubThreadId;
 
 
    // サブスレッドの生成&起動
    void BootThread()
    {
        // ----------------
        // サブ・スレッドへのパラメータを生成
 
        CSubThreadParam param = new CSubThreadParam();
 
 
        // ----------------
        // サブ・スレッドを生成&起動
 
        m_SubThread = new Thread( SubThreadProc );
 
        m_SubThread.Start( param );
 
 
        // ----------------
        // サブ・スレッドのスレッド ID を取得
 
        bool bUpdate = false;
 
        // サブ・スレッドでスレッド ID を取得するまでループ
        do
        {
            Thread.Sleep( 200 );
 
            lock( param.m_lockObject )
            {
                bUpdate = param.m_bUpdate;
 
                m_SubThreadId = param.m_nThreadId;
            }
        }while( bUpdate == false );
 
 
        // ここ以降はサブ・スレッドの ID を利用できる
    }
 
 
    // サブスレッド
    void SubThreadProc( Object cntxt )
    {
        CSubThreadParam param = (CSubThreadParam)cntxt;
 
        // スレッド ID を取得
        lock( param.m_lockObject )
        {
            param.m_bUpdate = true;
            param.m_nThreadId = GetCurrentThreadId();
        }
 
        // ここで何かしらの処理
    }
 
 
    // サブスレッドへのパラメータ
    // サブスレッドの ID を取得するためのもの
    // 各フィールドは lock ステートメント内でアクセスすること
    class CSubThreadParam
    {
        // ロックオブジェクト
        public Object m_lockObject = new Object();
 
        public bool m_bUpdate = false;
 
        public uint m_nThreadId = 0;
    }
 
 
    [DllImport(@"Kernel32.dll")]
    extern static UInt32 GetCurrentThreadId();