Я пытаюсь заставить простую сетевую программу работать с потоками. Идея заключалась в том, чтобы иметь два потока, один для отправки и один для получения данных через сокет. Поток, ответственный за чтение данных, обновит буфер, чтобы отправитель мог получить ответные сообщения для подтверждения действий и т. Д. В программе есть класс 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 ++, поэтому я прошу прощения, если мой вопрос сбивает с толку.