#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*
.