サーバーに問題が発生しました。
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");" の前にアプリケーションがクラッシュします。
ありがとう。