@Billy_Milligan

Как создать потоки для чтения и записи для сокета?

Приходится писать на 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 потока?
  • Вопрос задан
  • 465 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы