私の_beginthreadex()の使用法は次のとおりです。
cStartable基本クラス
virtual bool Start(int numberOfThreadsToSpawn);
virtual bool Stop();
virtural int Run(cThread &myThread) = 0;
//the magic...
friend unsigned __stdcall threadfunc(void *pvarg);
void StartableMain();
majicは:
unsigned __stdcall threadfunc(void *pvarg)
{
cStartable *pMe = reinterpret_cast<cStartable*>(pvarg);
pMe->StartableMain();
}
void cStartable::StartableMain()
{
//Find my threadId in my threadMap
cThread *pMyThread = mThreadMap.find( GetCurrentThreadId() );
int rc = Run( pMyThread );
}
bool cStartable::Start()
{
cThread *pThread = new cThread();
pThread->Init();
mThreadMap.insert( tThreadMapData(pThread->mThreadId, pThread) );
}
およびユーティリティcThreadクラス。
bool cThread::Init(cStartable *pStartable)
{
_beginthreadex( NULL, /*stack*/ 65535), &threadfunc, pStartable, /*initstate*/0, &mThreadId );
// now cThread has a unique bit of info that can match itself up within the startable's run.
}
スレッドを必要とするものはstartableから継承し、Runを実装します。
class Node : public cStartable {}
ここでコードをかなり編集しました。単一のオブジェクトから複数のスレッドインスタンスを一度に生成し、サブクラスレベルで非常にクリーンにすることができるのは、すべて非常に堅牢で静かで強力です。
このすべてのポイントは、cNode :: Run()が、スレッドごとのインスタンスのヒープデータをアタッチできるスレッドごとのインスタンスオブジェクトに渡されることです。それ以外の場合、すべてのスレッドインスタンスは、単一のクラスインスタンスを「メモリスペース」として共有します。私はそれが好きです:)あなたがより多くの詳細を必要とするならば、私は共有してうれしいです。