私はc++(linux)でマルチスレッドサーバーを書いています。私の問題は、最初のいくつかのリクエストではコードが正常に実行されるのに、その後は「free:Invalidpointer」と表示されることです。このエラーはコードのどの部分からも発生する可能性があることはわかっていますが、以下のスニペットについては、正しい方向に進んでいるかどうかの提案を知りたいと思います。
//これはpthread_createで使用されるヘルパー関数です
void *Parse::serveRequest_helper(void *c)
{
Parse *P1 =(Parse *)c;
P1->serveRequest();
}
//この関数では、10個のスレッドが継続的に機能しています
void Parse::serveRequest()
{
pthread_detach(pthread_self());
while(1)
{
pthread_mutex_lock(&print_lock);
if(requestqueue.empty())
pthread_cond_wait(&print_cond, &print_lock);
SendData *S = new SendData;
clientInfo c;
cout<<"Inside Serving thread"<<endl;
c = requestqueue.front(); //assuming this queue has data coming from some other scheduler thread function
requestqueue.pop();
S->requestPrint(c);
delete S;
pthread_mutex_unlock(&print_lock);
cout<<" Inside Thread is out"<<endl;
}
}
//以下の関数は、ファイルのデータをソケットに書き込むために使用しています。
//スレッドがこの関数を処理する場合、ファイルポインタはスレッドに対してローカルになるか、10個のスレッドすべてに対してグローバルになります..?
void SendData::requestPrint(clientInfo c)
{
if (write(c.accept,"Requested File Data :", 21) == -1)
perror("send");
ifstream file;
file.open(c.filename.c_str());
if (file.is_open())
{
string read;
while (!file.eof() )
{
getline(file,read);
if (write(c.accept, read.c_str(), (size_t)read.size()) == -1)
perror("send");
}
}
file.close();
close(c.accept);
}