マイ_beginthreadex()は、以下のように使用があります。
MAJICは
virtual bool Start(int numberOfThreadsToSpawn);
virtual bool Stop();
virtural int Run(cThread &myThread) = 0;
//the magic...
friend unsigned __stdcall threadfunc(void *pvarg);
void StartableMain();
cStartable基底クラス:
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.
}
スレッドを必要とするものは、起動可能なものから継承し、その実行を実装します。
class Node : public cStartable {}
ここでコードをかなり編集しました。 1つのオブジェクトから複数のスレッドインスタンスをまとめて生成し、サブクラスレベルできれいにすることができるためには、非常に堅牢で静かです。
これは、cNode :: Run()が、スレッドインスタンスごとのヒープデータを添付できるスレッドインスタンスオブジェクトに渡されるという点です。それ以外の場合は、すべてのスレッドインスタンスが単一のクラスインスタンスを「メモリ空間」として共有します。私はそれが好きです:) あなたがもっと詳細を必要とするなら、私は共有してうれしいです。
どのオブジェクトですか? 7つのノードはスレッドごとに1つであるはずですか? – bitmask
あなたは変数のスレッド固有のインスタンスを要求していますか?そうであれば、スレッドIDで索引付けされたハッシュテーブルを調べるか、スレッドローカルストレージを使用してみてください。 – Rick