【问题标题】:C++ Thread blocks Main-ThreadC++ 线程阻塞主线程
【发布时间】: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


【解决方案1】:
    Networking::Client* ClientPtr = new Networking::Client();
    boost::thread tClient(&Networking::Client::Initialize, ClientPtr);

这行得通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多