0

サーバーに問題が発生しました。

ThreadPool でタスクを実行すると、サーバーがクラッシュします。

スレッドプールが使用される関数の一部を次に示します。

void CSConnection::onReadable(const AutoPtr<ReadableNotification>& pNf)
{
    try
    {
        int n = _socket.receiveBytes(_pBuffer, BUFFER_SIZE);
        if (n > 0)
        {
         //app.logger().information("Packet s " + nb.format(nBytes) + ", group : " + nb.format(_pBuffer[4]) + ", type : " + nb.format(_pBuffer[6]));
            unsigned short packetID;
            packetID = (_pBuffer[4] * 666) + _pBuffer[6];
            switch(packetID)
            {
                case 666:
                    {
                        QuitHandler* qh = new QuitHandler();
                        qh->_con = this;
                        WorkerThreadPool::getInstance().tp->start(*qh);

ケース 666 が実行されると、サーバーがクラッシュします。(この場合のみ、テストにスレッド プールを使用します)

WorkerThreadPool クラスがあります:

using Poco::ThreadPool;

class WorkerThreadPool
 {
  private:
        WorkerThreadPool()
        {
            tp = new ThreadPool();
        }
        ~WorkerThreadPool()
        {
            tp->joinAll();
            delete tp;
        }
  public:
        ThreadPool * tp;
        static WorkerThreadPool& getInstance()
        {
          static WorkerThreadPool instance;
          return instance;
        }
 };

そこで QuitHandler クラス:

using Poco::Runnable;


    class QuitHandler : public Runnable
    {
        public:
            QuitHandler(){}
            CSConnection * _con;
            void run();
            virtual ~QuitHandler();
        protected:
        private:
            char * _packet;
    };

そして定義を実行します:

void QuitHandler::run()
{
    Application &app = Application::instance();
    app.logger().information("quith");
    unsigned short len = 9;
    char * reply = new char[len]();
    ///build packet header
    //set len (it's short)
    reply[0] = len & 0xff;
    reply[1] = (len >> 8) & 0xff;
    reply[4] = 3; //group
    reply[6] = 100; //type
    ///body
    //empty
    _con->sendBlocking(reply, len);
    delete [] reply;
}

ログ "app.logger().information("quith");" の前にアプリケーションがクラッシュします。

ありがとう。

4

0 に答える 0