2011-07-13 6 views
2

forループ内にCreateThread()呼び出しがあり、すべてのスレッドを次々に起動し、各スレッドがオブジェクトにデータを書き込むようにしたい。C++での応答を待たずにスレッドを起動するには?

 `$while (ii != mapOServs.end()) 
{ 
     Array_of_Thread_Handles[i] = CreateThread(NULL,0,MyThread, &args[i] , 0 , NULL); 
    } 

しかし、スレッドはWaitForMultipleObjectsまたはWaitForSingleObjectに達するまで開始しません。

応答を待たずにすべてのスレッドを順番に実行させるにはどうすればよいですか?

また、異なるスレッドによって同時に変更できるように、使用するのに最適なオブジェクトは何ですか?

答えて

7

スレッドは実際にすぐに開始されます--- Windowsは必要な内部構造を作成し、スタックなどを割り当て、スケジューラの実行リストに追加します。ただし、必ずしも予定のとは限りません。

特に、起動を行っているスレッドは、タイムスライスを使い切るまで実行され続ける可能性があります。プロセッサーコア(他のプロセスのスレッドを含む)より多くのスレッドを実行している場合は、しばらくの間新しいスレッドをプロセッサー上にスケジュールすることはできません。起動するスレッドは、WaitForSingleObjectなどの同期呼び出しまで実行することがあります。いずれも仕事をする機会がありました。

4

実際にスレッドはすべてすぐに開始します。その構造体へのアクセスを正しく同期させる限り、スレッドから任意のデータ構造体に書き込むことができます。

+1

ただし、タスクスケジューラはメインスレッドを実行したままにしてしばらくしてからしかスレッドを実行できないため、CreateThread関数の後に実際には動作しないことがあります。 – Vitor

2

デバッグ中にスタックしているようです。 CreateThreadをステップオーバーすると、その時点でデバッグであるため、すぐにスレッドを作成して実行することができない場合があります。 コードを積極的にデバッグしている間は、1つのスレッドのみを実行できることを覚えておいてください。 F10またはF11を押すと、デバッガはデバッグを実行するようになり、最終的にOSにプロセス/スレッドの実行を依頼します。私はさらに追加するかもしれませんが、あなたの質問にはより明確な説明が必要です。

+0

あなたは正しいです、私はデバッグに固執しています。あるスレッドをデバッグしている間に他のスレッドが実行されずにメッセージが表示されないのはなぜかと思いました。 – roymustang86