Получение core :: Program прервано с помощью core

#c #core

#c #Ядро

Вопрос:

Я использовал два класса: один Dataprocessor, который будет обрабатывать файл и подсчитывать общее количество экземпляров этого слова в каждой строке. Пытался сделать это с многопоточностью, где поток будет инициирован, чтобы позаботиться о поиске в каждой строке.

Сохранение количества из каждой строки в векторе.

При выполнении без многопоточности все работает нормально.

     void DataProcessor::countInstance ()
    {
            int pos = -1, count = 0;
            string lineFromFile;
            cout << "In countInstance" <<endl;
            getline (m_file, lineFromFile);        <<<< Not getting line read from file
            while(true)
            {
                    pos = lineFromFile.find(mStr_word,   pos);
                    if (pos != std::string::npos)
                            count  ;
                    else
                            break;
            }
            mVec_countPerLine.push_back(count);
            cout <<mStr_word << "****" <<lineFromFile <<endl;
            cout << mVec_countPerLine[0]<<endl;
    }
    DataProcessor::~DataProcessor()
    {
            m_file.close();
    }

    ////////

    void *ThreadFunction (void *dp)
    {
            pthread_mutex_lock( amp;mutex1 );
            DataProcessor *dProcessor = static_cast<DataProcessor *> (dp); <<<just curious if casting is creating a problem

            cout << "IN ThreadFunction"<< endl;
            dProcessor->countInstance ();
            pthread_mutex_unlock( amp;mutex1 );
    }

    class MyThread
    {
    private:
            pthread_t threads[10];
    public:
            MyThread ();
            void createThread (DataProcessor *);
            ~MyThread ();
    };
  

Здесь я создаю потоки в цикле

     void MyThread::createThread (DataProcessor *dProcessor)
    {
            cout << "IN CREATE THREAD::";
            int numLinesInFile, rc;
            numLinesInFile = dProcessor->getNumLinesInFile();
            for ( int i =0; i < numLinesInFile; i  )
            {
                    rc = pthread_create(amp;threads[i], NULL,
                                            ThreadFunction, (void *)amp;dProcessor);
                    if (rc)
                    {
                            cout << "Error:unable to create thread," << rc << endl;
                            exit(-1);
                    }
            }
            for ( int i =0; i < numLinesInFile; i  )
                    pthread_join(threads[i], NULL);
            pthread_exit(NULL);
    }

    MyThread::~MyThread ()
    {
    }


    ########################################################
    Calling these two objects from:-

            dProcessor.openFile("example.txt");
            dProcessor.setWord(readData);
            MyThread thread;
            thread.createThread (amp;dProcessor);
            dProcessor.displayResult();
  

Но получение:

     IN CREATE THREAD::IN ThreadFunction
    In countInstance
    terminate called after throwing an instance of 'std::bad_cast'
      what():  std::bad_cast
    Aborted (core dumped)
  

Кто-нибудь может помочь мне выяснить причину этого?

Ответ №1:

В вашем приведении указано, что параметр является указателем на DataProcessor :

  static_cast<DataProcessor *> (dp);
  

но вы передаете указатель на указатель на DataProcessor :

 (void *)amp;dProcessor
  

Потеря приведения и амперсанда:

 rc = pthread_create(amp;threads[i], NULL, ThreadFunction, dProcessor);
  

Кстати: вам никогда не нужно приводить указатель в void* .