2012-02-15 20 views
0

私はLinuxでC++のスレッドを使ってプログラムを書いています。マルチスレッド制限?

現在、スレッドの配列を保持しており、1秒が経過するたびに、どちらが終了したかを確認して再起動します。これは悪いですか?私はこのプログラムを長い間実行し続ける必要があります。今のようにスレッドを再起動するように多くのループ(最後の試行では100回目のループ)の後でコード11を取得しています。私はスレッドを再利用していることを理解し、一度に実行するスレッドの数を少なくして、制限を打つことはないと確信しました。私が使用している配列は8のサイズしか持っていません(もちろん、私は毎回8を起動しているわけではなく、停止しているものだけです)。

アイデア?

私のコードは以下の通りです:私はループに入るとスレッドを最初に起動することができ、ちょうどそのよう

if (loop_times == 0 || pthread_kill(threads[t],0) != 0) 
{ 
    rc = pthread_create(&threads[t], NULL, thread_stall, (void *)NULL); 
    if (rc){ 
     printf("ERROR; return code from pthread_create() is %d\n", rc); 
     exit(-1); 
    } 
thread_count++; 
} 

loop_times変数があります。それ以外の場合は、スレッドが以前に開始されていないため、SEGFAULTを取得します。

また、(limits.hに含む場合も)私はPTHREAD_THREADS_MAXの値を見たいと思ってきたが、私はそれを印刷することはできません

+0

プログラムがしばらく実行されている場合は、ps -eLfを使用して、Linuxが使用していると思うスレッド数を確認できます。 – masebase

+0

最近のコンパイラを使用している場合は、pthreadsの代わりにC++ を使用してください。 –

+0

スレッドを強制終了することは非常に悪い習慣です。彼らは終わりましょう。多くのスレッディングAPIはあなたにこの可能性を与えません。そうすることをお勧めする人はいません。 –

答えて

1

私の問題は、毎回それを再起動する前に私のスレッドをpthread_joinする必要があるということでした。その後、私はコード11を取得するのをやめ、Valgrindを通して実行するときに "まだ到達可能"なメモリを持っていなくなった。

2

あなたが複数のスレッドを使用したい場合は...それは良く行きますスレッドプール用 スレッドのセットをデタッチしたスレッドとして開始し、キューを介してすべてのスレッドに情報を送信して、スレッドがそれを処理して次の入力を待つことができます。

+0

それには提出されていないブーストライブラリがあります(boost.threadpool)。 –

+0

さらに、多くのスレッドを作成すると、アプリケーションのパフォーマンスが低下する*でしょう。 –

+0

これは私が一度に一度に最大8つしか使用しない理由です。 ..多分私はあなたのコメントを誤解しています。 – Risshuu