вектор в качестве входных данных для pthread_create - PullRequest
0 голосов
/ 05 июля 2019

Я передал структуру в pthread_create.Одним из компонентов структуры являются векторные данные.«data» push_back в цикле в каждом потоке.Когда размер цикла невелик, код выполняется правильно.Когда петля большая.Я получил следующее сообщение об ошибке:

munmap_chunk (): неверный указатель munmap_chunk (): неверный указатель прерван (ядро сброшено)

Я пробовал m <100, все работает.При попытке m <1000, это показывает ошибку.</p>

// compile using: g++ parallel_2.C -o oo -lpthread
#include <iostream>
#include <cstdlib>
#include <vector>
#include <thread>


using namespace std;

const unsigned NUM_THREADS = std::thread::hardware_concurrency();


//
struct INPUT
{
    int start;
    int end;
    vector<int> data;
};

//
void *Loop(void *param)
{
   INPUT *in = (INPUT*)param;
   int start = in->start;
   int end = in->end;

   cout<<" start: "<<start<<" end: "<<end<<endl;
   //for(int m=0; m<100000000; m++) 
   for(int i = start;i < end;i++)
       for(int m=0; m<1000; m++) {
           in->data.push_back(i);
       }

   //pthread_exit(NULL);
}

//
int main ()
{
   pthread_t threads[NUM_THREADS];

   INPUT input[NUM_THREADS];

   for( int i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;

      input[i].start = i*5;
      input[i].end = input[i].start + 5;
      int rc = pthread_create(&threads[i], NULL,
                          Loop, (void *)&input[i]);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }

   }
   for(int i = 0; i<NUM_THREADS; i++)
       cout<<"!! size of "<<i<<": "<<input[0].data.size()<<endl;
   pthread_exit(NULL);
}

munmap_chunk (): неверный указатель munmap_chunk (): неверный указатель прерван (ядро выгружено)

1 Ответ

3 голосов
/ 05 июля 2019

В конкретном случае этого примера (main() предполагает, что потоки выполнены и обращается к измененным структурам), вам необходимо join() поток, прежде чем получить доступ к структуре, которую он изменяет.

for(int i = 0; i<NUM_THREADS; i++)
{
  pthread_join(threads[i], NULL);
  cout<<"!! size of "<<i<<": "<<input[0].data.size()<<endl;
}

Таким образом, вы уверены, что это сделано, и больше не изменяете структуру.

Проблема не проявлялась с очень небольшим количеством итераций, потому что потоки, вероятно, (но не уверены) закончили свою задачудо того, как ваш последний цикл в main() попытался получить доступ к их структурам.

Кстати, вы должны рассмотреть возможность использования std::thread.
(https://en.cppreference.com/w/cpp/thread/thread/thread)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...