0

での使用方法を示す簡単な例を見つけましtreadsC++。それがどのように機能するかは理解していますが、ソースをvectorの代わりにスレッドを使用するように変更することはできませんarray。好きvectorなだけスレッドを作成できるようにしたいです。実装方法とどこで間違いを犯すか教えてください(コメント付きのコードは私が実装しようとしたものです)?

#include <iostream>
#include <pthread.h>
#include <vector>

using namespace std;

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   cout << "Hello World! Thread ID, " << tid << endl;
   pthread_exit(NULL);
}

int main ()
{
   // vector<pthread_t> vectorOfThreads;
   pthread_t threads[NUM_THREADS];
   int rc;
   int i;
   for( i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;

      // rc = pthread_create(&vectorOfThreads[i], NULL, 
      //                    PrintHello, (void *)i);

      rc = pthread_create(&threads[i], NULL, 
                          PrintHello, (void *)i);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         return 1;
      }
   }
   pthread_exit(NULL);
   return 0;
}
4

3 に答える 3

5

デフォルトで構築されたベクトル ( vector<pthread_t> vectorOfThreads;) は空から始まります。つまり、ループ内でアクセスするvectorOfThreads[i]と、未定義の動作が発生します (おそらく、segfault によるクラッシュ)。

ベクトルを次のように作成する場合

vector<pthread_t> vectorOfThreads(NUM_THREADS);

それはうまくいくでしょう。

または:

vector<pthread_t> vectorOfThreads;
//...
for(/*...*/) {
    pthread_t new_thread;
    rc = pthread_create(&new_thread, NULL, 
                              PrintHello, (void *)i);
    vectorOfThread.push_back(new_thread);
}

ベクトルとそのメンバー関数の機能の詳細については、こちらを参照してください。

于 2013-05-22T08:32:20.387 に答える
1

コードは、ベクターに追加される前にベクター エントリを使用します。zakinster は 1 つの解決策を提供します。もう1つは使用することです:

  vectorOfThreads.resize(NUM_THREADS);

NUM_THREADSこれにより、空の要素を持つベクターが作成されます。これらの要素を配列のように使用できるようになりました。

于 2013-05-22T08:32:29.697 に答える
1

pthread_t最初に要素を割り当てる必要があります:

pthread_t newThread;
rc = pthread_create(&newThread, NULL, PrintHello, (void *)i);
vectorOfThreads.push_back(newThread);
于 2013-05-22T08:30:05.073 に答える