首页 > 解决方案 > C ++在两个分离的线程之间共享非阻塞队列和互斥锁

问题描述

我今天正在尝试在 C++ 中学习 std::thread 。我的目标是生成两个线程,一个是网络侦听器,另一个是网络发送器。侦听器将从目标服务器获取反馈消息,然后通过共享队列(非阻塞)向发送器发送命令。我对共享队列的正确方法有点困惑。

我有一个名为 Network 的类,其中包含上述所有内容,这是其中的一部分。

//part of my class

std::mutex mMessageMutex;

//message is class for messages to share
queue<message> mMessageQueue; 

std::thread mTCPthread;
std::thread mUDPthread;

Network::threadTest(){
    mTCPthread =  std::thread(&Sender::tcpThread, this);
    mUDPthread =  std::thread(&Sender::udpThread, this);
    mTCPthread.detach();
    mUDPthread.detach();

}

Network::tcpThread(){
    //wait for messages
    while(1)
       if(messageFromNetwork)
          mMessageQueue.push(_message);
}

Network::udpThread(){
    //do some work
    while(1){
    if(mMessageQueue.size > 0){
        message = mMessageQueue.front();
        mMessageQueue.pop();
        //process message
    }
  }
}

然后我创建一个新的网络对象并在这个示例主函数中启动 threadTest。最后,我循环等待某种用户干预。

///////////////////
int main(void){
    std::unique_ptr<Network> _network(new Network());

    unique_ptr->threadTest();

    while(1){
        //wait on user input or stop signal
    }

}

所以从我的阅读来看,我认为只要我不退出 main 或者如果我在另一个函数中这样做,只要我不让 _network 超出范围,那么 mMessageMutex 和 mMessageQueue 将可用于两个线程使用?

我还刚刚学会了如何使用 unique_ptr (对于老前辈来说,c++ 中的情况发生了变化!)。所以我希望当 _network 超出范围时,mTCPthread、mUDPthread 和 _network 都将被销毁而不是泄漏。

谢谢

标签: c++multithreading

解决方案


推荐阅读