The problem is on these lines:
aClassB.startTheThread((void (*)(int*)) &ClassA::parseData);
...
pthread_create(&_theDataReaderThread,
NULL,
(void* (*)(void*)) &ClassB::dataReader,
this);
Those are invalid type-casts. You cannot cast a non-static method pointer into a function pointer like this. pthread_create()
requires a standalone function or class static method only.
If you are using C++11 or later, try this instead:
ClassA.h
class ClassA
{
public:
ClassA();
~ClassA();
void setFunctionPointers();
void parseData(int* dataBuffer);
};
ClassA.cpp
#include "ClassB.h"
ClassB aClassB;
ClassA::ClassA(){}
ClassA::~ClassA(){}
void ClassA::setFunctionPointers(){
aClassB.startTheThread( [this](int *dataBuffer){ this->parseData(dataBuffer); } );
}
void ClassA::parseData(int* data){
std::cout << "data received: " << *data << "\n";
}
ClassB.h
#include <functional>
#include <pthread.h>
class ClassB
{
public:
using ParseFunction = std::function<void(int*)>;
ClassB();
~ClassB();
static void* dataReader(void*);
void startTheThread(ParseFunction parseFunction);
ParseFunction _theParseFunction;
pthread_t _theDataReaderThread;
};
ClassB.cpp
int* intPointer;
ClassB::ClassB(){}
ClassB::~ClassB(){
delete intPointer;
}
void* ClassB::dataReader(void *arg){
ClassB *pThis = static_cast<ClassB*>(arg);
intPointer = new int(5);
while (true){
pThis->_theParseFunction(intPointer);
sleep(2);
}
}
void ClassB::startTheThread(ParseFunction parseFunction){
_theParseFunction = std::move(parseFunction);
int threadReturn = pthread_create(&_theDataReaderThread,
NULL,
&ClassB::dataReader,
this);
}
main method
int main()
{
ClassA aClassA = ClassA();
aClassA.setFunctionPointers();
while(true)
{
}
return 0;
}
Though, you really should be using std::thread
instead of pthread_create()
:
ClassA.h
class ClassA
{
public:
ClassA();
~ClassA();
void setFunctionPointers();
void parseData(int* dataBuffer);
};
ClassA.cpp
#include "ClassB.h"
ClassB aClassB;
ClassA::ClassA(){}
ClassA::~ClassA(){}
void ClassA::setFunctionPointers(){
aClassB.startTheThread( [this](int *dataBuffer){ this->parseData(dataBuffer); } );
}
void ClassA::parseData(int* data){
std::cout << "data received: " << *data << "\n";
}
ClassB.h
#include <functional>
#include <thread>
class ClassB
{
public:
using ParseFunction = std::function<void(int*)>;
ClassB();
~ClassB();
void dataReader();
void startTheThread(ParseFunction parseFunction);
ParseFunction _theParseFunction;
std::thread _theDataReaderThread;
};
ClassB.cpp
int* intPointer;
ClassB::ClassB(){}
ClassB::~ClassB(){
delete intPointer;
}
void ClassB::dataReader(){
intPointer = new int(5);
while (true){
_theParseFunction(intPointer);
sleep(2);
}
}
void ClassB::startTheThread(ParseFunction parseFunction){
_theParseFunction = std::move(parseFunction);
_theDataReaderThread = std::thread([this](){ this->dataReader(); });
}
main method
int main()
{
ClassA aClassA = ClassA();
aClassA.setFunctionPointers();
while(true)
{
}
return 0;
}
However, if you are using a pre-C++11 compiler, then you have to use a plain pointer-to-member-function instead:
ClassA.h
class ClassA
{
public:
ClassA();
~ClassA();
void setFunctionPointers();
void parseData(int* dataBuffer);
};
ClassA.cpp
#include "ClassB.h"
ClassB aClassB;
ClassA::ClassA(){}
ClassA::~ClassA(){}
void ClassA::setFunctionPointers(){
aClassB.startTheThread(&ClassA::parseData, this);
}
void ClassA::parseData(int* data){
std::cout << "data received: " << *data << "\n";
}
ClassB.h
#include <pthread.h>
class ClassA;
class ClassB
{
public:
typedef void (ClassA::*ParseFunction)(int*);
ClassB();
~ClassB();
static void* dataReader(void*);
void startTheThread(ParseFunction parseFunction, ClassA*);
ParseFunction _theParseFunction;
ClassA *_theParseObj;
pthread_t _theDataReaderThread;
};
ClassB.cpp
int* intPointer;
ClassB::ClassB(){}
ClassB::~ClassB(){
delete intPointer;
}
void* ClassB::dataReader(void *arg){
ClassB *pThis = static_cast<ClassB*>(arg);
intPointer = new int(5);
while (true){
pThis->_theParseObj->*(pThis->_theParseFunction)(intPointer);
sleep(2);
}
}
void ClassB::startTheThread(ParseFunction parseFunction, ClassA *parseObj){
_theParseFunction = parseFunction;
_theParseObj = parseObj;
int threadReturn = pthread_create(&_theDataReaderThread,
NULL,
&ClassB::dataReader,
this);
}
main method
int main()
{
ClassA aClassA = ClassA();
aClassA.setFunctionPointers();
while(true)
{
}
return 0;
}