Приходится писать на c++. В java все легче, возможно я пытаюсь использовать тот же подход или недостаточно знаний в с++. Вообщем нужно сделать 2 потока. Один для чтения с сокета, другой для записи в него. Queue моя реализация queue с мьтексами для потокобезопасного доступа. Проблема в том что я не понимаю как это сделать. Загвоздка в том, что для pthread_create нужны static методы, но и readCan и writeCan не могут быть статик.
//Can.h
class Can {
private:
int sockfd; /* can raw socket */
char *interface_name = "can0";
struct sockaddr_can addr;
pthread_t readThread;
pthread_t writeThread;
static Queue<can_frame> acceptQueue;
static Queue<can_frame> sendQueue;
static bool threadSign;
static void *runnerRead(void*);
static void *runnerWrite(void*);
bool openCan();
bool startThreads();
protected:
bool writeCan(msghdr msg);
bool writeCan(can_frame frame);
can_frame readCan();
public:
Can();
bool start();
void send(can_frame frame);
can_frame accept();
bool upCanInterface();
bool downCanInterface();
void closeCan();
};
//Can.cpp
void Can::send(can_frame frame) {
sendQueue.push(frame);
}
can_frame Can::accept() {
return acceptQueue.pop();
}
bool Can::writeCan(can_frame frame) {
if(sockfd <= 0) {
std::cout << "ERROR: " << "Can't write to CAN socket (sockfd = " << sockfd << ")" << std::endl;
return false;
}
if(write(sockfd, &frame, CAN_MTU) != CAN_MTU) {
std::cout << "ERROR: " << "Can't write to CAN socket (write() return value < 0)" << strerror(errno) << std::endl;
return false;
}
return true;
}
can_frame Can::readCan() {
can_frame frame;//test
return frame;
}
bool Can::startThreads() {
if(pthread_create( &readThread, NULL, &runnerRead, NULL )) {
std::cout << "ERROR: " << "Can't start read thread CAN" << std::endl;
return false;
}
if(pthread_create( &writeThread, NULL, &runnerWrite, NULL )) {
std::cout << "ERROR: " << "Can't start write thread CAN" << std::endl;
return false;
}
return true;
}
void *Can::runnerRead(void*) {
while(threadSign) {
acceptQueue.push(readCan());
}
}
void *Can::runnerWrite(void*) {
while(threadSign) {
writeCan(sendQueue.pop());
}
}
Как правильно реализовать 2 потока?