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]会导致未定义的行为(可能是由于段错误而导致的崩溃)。

如果您将向量创建为

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

您必须先分配pthread_t元素:

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

您的代码在将向量条目添加到向量之前使用它。zakinster 给出了一种解决方案。另一种是使用:

  vectorOfThreads.resize(NUM_THREADS);

这将创建一个NUM_THREADS包含空元素的向量。您现在可以像使用数组一样使用这些元素。

于 2013-05-22T08:32:29.697 回答