我今天正在尝试学习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都将被破坏并且不会泄漏。
谢谢