【发布时间】:2019-10-20 15:13:01
【问题描述】:
我正在尝试让一个简单的网络程序与线程一起工作。这个想法是有两个线程,一个用于通过套接字发送数据,一个用于接收数据。负责读取数据的线程将更新缓冲区,以便发送方可以获取响应消息以确认操作等。该程序有一个名为 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
我对 c++ 不是很有经验,所以如果我的问题令人困惑,我深表歉意。
【问题讨论】:
-
This does not work部分似乎没有任何共享的mutex。 -
你爱上了一个经典:它被称为“最令人头疼的 C++ 解析”。使用它作为搜索词。也就是说,作为这里的新用户,请使用tour 并阅读How to Ask。
-
@appleapple 头文件中的定义不够?它必须在某处声明吗?谢谢你的回答!
-
@ggg 同一个实例的 mutex 应该在所有线程中使用。在
netctl.cpp中,您构造了一个互斥体并销毁它,它绝不会被共享。在.h中,您只需声明一个指针,它也不会工作。 -
正是我的意思,@ggg。
Netctl network_control();声明一个函数。我认为使用现代 C++ 更好的语法是Netctl network_control{};。