c ++ объявляет мьютекс в классе с отдельным заголовком - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь заставить простую сетевую программу работать с потоками. Идея заключалась в том, чтобы иметь два потока, один для отправки и один для получения данных через сокет. Поток, ответственный за чтение данных, обновит буфер, чтобы отправитель мог получить ответные сообщения для подтверждения действий и т. Д. В программе есть класс netctl.cpp и заголовок netctl.h. Когда я попытался объявить мьютекс, который я собирался использовать для буфера в заголовке, я получил массу ошибок. Поэтому вместо этого я попытался передать указатель мьютекса на конструктор netctl, и это сработало.

Является ли этот подход безопасным / хорошей практикой? В противном случае, как бы настроить его для этого сценария?

Это работает

 // launch.cpp

int main(){
    std::mutex mtex;
    Netctl network_control(&mtex);

    std::thread thread_listener(&Netctl::network_listener, network_control);
    thread_listener.join();
}
// netctl.cpp

#include "netctl.h"
Netctl::Netctl(std::mutex* m){
    mutex = m;
}

Netctl::~Netctl(){}
// netctl.h

#ifndef NETCTL_H
#define NETCTL_H

class Netctl{
    public:
        Netctl(std::mutex* m);
        ~Netctl();

    private:
        std::mutex* mutex;
};
#endif

Я ожидал, что приведенный ниже пример будет работать,почему это не работает? Я понимаю, что мьютексы не могут быть скопированы. Но почему я не могу создать мьютекс в конструкторе или в заголовке?

Это не работает

// launch.cpp

int main(){

    Netctl network_control();

    std::thread thread_listener(&Netctl::network_listener, network_control);
    thread_listener.join();
}
// netctl.cpp

#include "netctl.h"
Netctl::Netctl(){
    std::mutex mtex; // tried declaring mutex here
}
Netctl::~Netctl(){}
// netctl.h

#ifndef NETCTL_H
#define NETCTL_H

class Netctl{
    public:
        Netctl();
        ~Netctl();

    private:
        std::mutex* mutex; // also tried it here
};
#endif

I 'Я не очень опытный с C ++, поэтому я прошу прощения, если мой вопрос сбивает с толку.

1 Ответ

0 голосов
/ 22 октября 2019

После некоторого исследования я столкнулся с кем-то, у кого была похожая проблема https://stackoverflow.com/a/46295882/11795104. Добавление std :: ref решило мою проблему.

std::thread thread_listener(&Netctl::network_listener, std::ref(network_control));
std::thread thread_keyboard(&Netctl::user_input, std::ref(network_control));
...