【发布时间】:2018-02-16 11:19:37
【问题描述】:
问题:当调用 ExecuteQueue 函数时,队列中已经有两个现有的数据包,它们被正确调用(打印到控制台)。但是即使 ExecuteQueue 函数在另一个线程中循环,主线程也会被阻塞(它永远不会到达 QueuePacket)。
我已经浏览过 stackoverflow 并且大多数问题都与 .join 有关,但这个问题可能不是(删除 .join 没有区别)。
Main.cpp
int main() {
// Start Client
boost::thread tClient(&Networking::Client::Initialize, Networking::Client()); // Still in Main-Thread???!?!?
Networking::Client::QueuePacket(Networking::Packet::Types::Disconnect);
// Start Modules
tClient.join();
return 0;
}
Client.cpp(仅必要的函数)
static bool QueuePacket(Packet p) { // Pushes existing Packet
return Globals::Queue.push(p);
}
void ExecuteQueue() {
while (Client::Active && Globals::NetworkConnectivity) {
if (Globals::Queue.empty()) { Sleep(500); continue; }
Packet p(Packet::Types::Invalid);
if (!Globals::Queue.pop(p)) continue; // Copies Packet into p on Success
if (p.Type == Packet::Types::Disconnect) { Client::Active = false; } // Disconnects Queue
if (p.Type == Packet::Types::Invalid) { } // Find some error handling here
ExecutePacket(p);
}
}
【问题讨论】:
-
还有什么问题?
-
@tambre 我会做一个有根据的猜测并说你如何防止阻塞主线程......?
-
我认为没有足够的信息来回答这个问题。
标签: c++ multithreading std boost-thread