【问题标题】:c++ declaring a mutex in a class with seperate headerc ++在具有单独标题的类中声明互斥锁
【发布时间】: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{};

标签: c++ pthreads mutex


【解决方案1】:

经过一些研究,我发现有人遇到了类似的问题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));

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 2015-10-06
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多