2012-05-09 14 views
0

ループが実行されている次のサンプルプログラムを検討してください。C++スレッドの概念

int main() 
{ 

    for (int i = 0; i<= 300; ++i) { 

    } 

} 

今の私はiの値から毎秒を印刷したいとしましょう、かなり基本的な:「elaspedTimeは」を含む架空の整数であり、以下のような

cout << "i= " << i << "\n"; 

単純なループは、十分かもしれませんここでの最終的な目標は、以下の(assuのような出力を与えることです

int lastTime = 0; 
while (true) { 
    if (elapsedTime > lastTime) { // Another second has passed 
    cout << "i= " << "\n"; 
    lastTime = elapsedTime; 
    } 
} 

:秒数は、プログラムが魔法のようにOSによって更新が実行されていますそれは古い、遅いCPU上にあったので、明はループ)が正確に毎秒100回を走った:

$ ./myprog 
i= 100 
i= 200 
i= 300 

これらは本にもかかわらず、私は「古典的で、このような操作を実行する方法を参照していない、シンプルな機能とルーチンです"普通はmain()という機能を持つC++プログラムです。シンプルさにもかかわらず、私はマルチスレッドを学ぶ必要があるのですか?または、関数をmain()から呼び出すことは可能ですか?戻り値を待つのではなく、スレッドと呼ばれる関数を呼び出すことはできませんか?

+0

私は何かが欠けているはずです。私はこれがスレッディングと何をしているのか理解していません。あなたがちょうど 'スリープ'機能を必要としているように見えます(他の処理には相当な時間がかかります)。 –

+1

マルチスレッドは必要ありませんここに。マルチスレッドが必要なときは、それを知るでしょう。 –

+0

申し訳ありませんが、私はこのすべてが 'main()'内で同時に起こりたいと思っていたと思いました。これらは本質的に互いに独立して走る2つのループであり、一方は他方の結果をプリントアウトする。それはそれをクリアしますか? – jwbensley

答えて

1

これを行う際に何が問題になっていますか?マルチタスキングは必要ありません。

int lastTime = 0; 
while (true) { 
    if (std::time() > lastTime) { // Another second has passed 
    cout << "i= " << i << "\n"; 
    // potentially expensive code goes here, which updates "i" 
    lastTime = std::time(); 
    } 
} 
+0

申し訳ありませんが、おそらく私は明確ではありませんでした。どのようにして、すべてのスレッドで起こっていることが、あなたの提案「私」が増分されていないのでしょうか? – jwbensley

+0

これは*すべてが1つのスレッドで起こっています。あるいは、このループをmainの 'for'ループと同時に実行する方法を尋ねていますか? –

+0

ああ、私は今、ループの中でイベントの順序を並べ替える必要があることがわかりました。ありがとうございます:D – jwbensley

3

あなたは2つの機能は、互いに独立して同じ正確な時間で実行したい場合は、スレッドを使用する必要があります。あなたが提供した例は、あなたが達成したいと言ったことを達成するためにスレッドを使用する必要はありませんが、あなたのコメントに基づいて、あなたの質問は少し不明であると思います。

マルチスレッドは、C++ 03標準で言及されていないものです。最新のC++ 11 Standardにはいくらかのサポートがありますが、それはすべてではありません。マルチスレッドが実際に実装される方法は、プラットフォーム固有です。 WinTelの箱はそれを一つの方法で行い、Linux/Intelの箱はそれを別の方法で行います。マルチスレッドコードの作成の主な2つのアプローチは次のとおりです。

  1. プラットフォーム固有の機能を使用します。
  2. クロスプラットフォームのスレッドライブラリを使用します。

これからは、クロスプラットフォームのライブラリを使い始めることをお勧めします。プラットフォーム固有の特異性に惑わされることなく、大きな画像の概念を多く得ることができます。そのようなライブラリの1つはBoost.Threadです。あなたはmutithreadedプログラミングに新しいしていることを考えると

EDIT

は、私はあなたに警告しなければならないと感じ:あなたは上の目隠しに深いウサギの穴を下にジャンプしています。マルチスレッド化されたプログラミングは、チェスのようなものです。基本的な構文とシステムコールの多くをかなり素早く学ぶことができますが、マルチスレッドプログラミングを行うは、ロットしかありません。正しく行われたマルチスレッド化されたプログラミングは、プログラマーが直面することの最も難しいことの1つです。あなたは物語が変化しても、「タスク」に「機能」から切り替えると

また、以下CrazyEddieさんのコメント@に特別な注意を払ってください。 多くのタスクをタスクに応じて一度に実行することは非常に可能です。 OPのようなイベントループは通常ほとんどの時間を費やしますので、スレッドは通常 のパフォーマンスまたは必要性ではなく便宜のためにのみ使用されます。私はあなたがこれを知っていると確信していますが、OPは恐らく ではありません。 OPは "非同期処理"を調べて、スレッドとノンブロッキング操作とイベント ループの使用/ペナルティの重みを とする必要があります。

+1

ストーリーが変わっても、「ファンクション」から「タスク」に切り替えると、タスクに応じて、一度に多くのタスクを実行することは非常に可能です。 OPのようなイベントループは通常、ほとんどの時間をスリープ状態で過ごすため、スレッドは通常、パフォーマンスや必要性ではなく便宜のためにのみ使用されます。私はあなたがこれを知っていると確信していますが、OPはおそらくそうではありません。OPは "非同期処理"を調べ、スレッドを使用する利点/ペナルティとノンブロッキングオペレーションとイベントループを比較する必要があります。 –

+0

@CrazyEddie:合意 - あなたのコメントを編集して取り入れます。 –

+0

これは本当に素晴らしい答えです。広範かつ詳細な答えの両方に感謝します。これは私に考えることをたくさん与えてくれました、ありがとうございます:) – jwbensley

0

あなたが解決しようとしている問題は何か不思議です。 「2回目に何回反復が行われるのか知りたがり」はどこから来たのですか?理由は私が尋ねるのは、あなたがトップ(チェッククロック - インクリメント - チェッククロック - インクリメント...チェッククロック - プリント)またはマルチスレッドアプローチで議論されたシングルスレッドアプローチどちらもスレッドの実行中のオーバーヘッドと不確実性を招きます。つまり、どちらの場合でも、シングルスレッドの場合はclock()呼び出しを、マルチスレッドの場合はスレッドの同期化を実行する必要があります。どちらもプログラムで1秒間に実行される反復回数の合計に影響します(数値は小さくなります)。結果は不正確になります。さらに、スレッドが実行されているときと次の利用可能な量子を待っているときに、スレッドスケジューラが決定子であるオペレーティングシステムがあります。そして、量子は〜20-30ミリ秒であるため、時間間隔のチェック中に生じる誤差は(おそらく平均して)数パーセントになる可能性があります。

開始時間を節約するのがより簡単で自然ではないでしょうか?すべてのデータを処理(すべての作業を行います)するために必要なすべての反復を行い、再度タイムスタンプを取り、時間間隔による反復。あるいは、あなたが解決しようとしている問題に固有の何かが、このアプローチがうまくいかないことはありますか?