2012-04-06 9 views
0

スレッドメソッドでオブジェクトを参照するときに使用する静的変数が必要です。 process.h_beginthreadメソッドを使用しようとしています。このタイプのオブジェクトの多くはスレッドメソッドを使用しています。インスタンス変数がクラス全体で共有されているため、現在はこれが失敗しています。 threadLoopで使用するインスタンス変数を静的にする必要があり、オブジェクトを参照する必要があります。助言がありますか?複数のオブジェクトの静的インスタンス変数 - C++

ヘッダ:static Nodes *instance;

実装:Nodes *Nodes::instance = NULL;

main.cppに:

for(int c = 0; c < 7; c++) 
{ 
    nodesVect.push_back(Nodes(c, c+10)); 
} 

for(int c = 0; c < 7; c++) 
{ 
    nodesVect.at(c).init(); // init() { instance = this; } 
} 
+0

どのオブジェクトですか? 7つのノードはスレッドごとに1つであるはずですか? – bitmask

+0

あなたは変数のスレッド固有のインスタンスを要求していますか?そうであれば、スレッドIDで索引付けされたハッシュテーブルを調べるか、スレッドローカルストレージを使用してみてください。 – Rick

答えて

0

マイ_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()が、スレッドインスタンスごとのヒープデータを添付できるスレッドインスタンスオブジェクトに渡されるという点です。それ以外の場合は、すべてのスレッドインスタンスが単一のクラスインスタンスを「メモリ空間」として共有します。私はそれが好きです:) あなたがもっと詳細を必要とするなら、私は共有してうれしいです。

関連する問題