9

forループ内に3つのスレッドを作成する短いプログラムを実行しようとしています。各スレッドは、画面の「内部」に書き込みます。これは、異なるマシン上のXPとVistaの両方で実行されているCygwinで発生しています。これは現在のコードです。

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
using namespace std;
void* printInside(void* arg);

int main()
{
    pthread_t threads[3];
    for(int i = 0; i < 3; i++)
    {
        pthread_create(&threads[i], 0, printInside, 0);
    }
    return 0;
}
void* printInside(void* arg)
{
    cout << "inside";
        return 0;
}

そして、それは機能しません。forループの内側にcoutを追加すると、動作が遅くなるように見えます。

for(int i = 0; i < 3; i++)
{
    cout << "";
    pthread_create(&threads[i], 0, printInside, 0);
}

なぜこれが当てはまるのかについての提案はありますか?

編集:

ループの後に結合を追加するための応答を受け取りました

int main()
 {
     pthread_t threads[3];
     for(int i = 0; i < 3; i++)
    {
        pthread_create(&threads[i], 0, printInside, 0);
    }
     for(int i = 0; i < 3; i++)
    {
        void* result;
        pthread_join(threads[i],&result);
    }
}
 void* printInside(void* arg)
 {
    cout << "inside";
    return 0;
}

しかし、それでも機能しません。結合が間違っていますか?

修繕

「出力は通常、標準ライブラリによってバッファリングされます。特定の状況ではフラッシュされますが、手動で実行する必要がある場合もあります。したがって、スレッドが実行されて出力が生成されても、フラッシュしない限り表示されません。」

4

2 に答える 2

8

参加する必要があります。そうしないと、メインスレッドが終了します。

for(int i = 0; i < 3; i++)
{
    pthread_create(&threads[i], 0, printInside, 0);
}
/* Join here. */

forループの内側にcoutを追加すると、動作が遅くなるように見えます。

行うことI/Oは一般的に困難で遅いです。これにより、他のスレッドが実行するのに十分なCPU時間が与えられます。

複数のスレッドを使用する場合、1つのスレッドを呼び出すとexit、すべてが死ぬことを忘れないでください。

編集

「inside」の末尾にendlを追加すると、動作が向上しますが、それはコップアウトソリューションのようです。参加が存在するのになぜそれが必要なのか疑問に思っています。

出力は通常、標準ライブラリによってバッファリングされます。特定の状況ではフラッシュされますが、手動で行う必要がある場合もあります。したがって、スレッドが実行されて出力が生成されたとしても、フラッシュしない限り表示されません。

于 2012-04-30T21:11:25.340 に答える
4
  • 待機せずにすべてのスレッドを開始し、実行を開始する前にメインスレッド(つまりプログラム全体)を終了します。

  • 戻る前に呼び出すpthread_joinと、他のスレッドが終了するのを待ちます。

  • cout実行する他のスレッドへのコンテキストスイッチとウィンドウを生成するので、役立ちます。

于 2012-04-30T21:12:50.027 に答える