Я получаю эту ошибку сегментации.Ошибка сегментации при работе с потоками
Он будет запускать первый метод, а затем линию printf второго метода, а затем переходит непосредственно к ошибке сегментации. Я не понимаю, почему ... Я освободил предыдущее распределение. В тот момент мой второй метод работает, он будет выводить prinf заявление: Затем клиент сегментации вине
void
ThreadTest()
{
DEBUG('t', "Entering SimpleTest");
printf("THREAD TEST\n");
Thread *s = new Thread("thread");
s->Fork(client2,1);
Thread *g = new Thread("thread");
g->Fork(client, 1);
}
МОЯ первый метод работает
void
client2(int which)
{
DEBUG('t', "Entering SimpleTest");
printf("client2\n");
int urlSize;
const int sz = 50;
char url[sz];
FILE *fp = fopen("url.txt", "r");
if (!fp)
printf(" Cannot open file url.txt!\n");
else {
int pos = 0;
char c = getc(fp);
while (c != EOF || pos == sz - 1)
{
if (c == '\n')
{
url[pos] = '\0';
//serve(url);
pos = 0;
//url size
urlSize = sizeof(url)/sizeof(url[0]);
//---------------------------------------------------------------------------
urlList = (List*)malloc(urlSize*sizeof(List));
//---------------------------------------------------------------------------
clientTXT.P(); //wait
mutex2.P();//entering critical region
urlList -> Append(url);
cout<<"urls: "<< url<<endl;
mutex2.V();//leaving critical region
clientURL.V();// increment slots or client url request objects
//--------------------------------------------------------------------------
free(urlList);
//---------------------------------------------------------------------------
}
else
{
url[pos++] = c;
}
c = getc(fp);
}
fclose(fp);
printf("No more URLs\n");
}
}
второй метод работает
void
client(int request)
{
DEBUG('t', "Entering SimpleTest");
printf("client\n");
int urlSize;
while(TRUE){
char* nextUrl;
printf("segment");
nextUrl = (char*)urlList->Remove();
urlSize = sizeof(nextUrl)/sizeof(nextUrl[0]);
Request *reqq = new Request(nextUrl, urlSize, request, 1);
//---------------------------------------------------------------------------
reqList = (List*)malloc(urlSize*sizeof(List));
//--------------------------------------------------------
clientURL.P(); //wait
mutex.P(); //entering critical region
reqList->Append(reqq);
cout<<"urldest: "<<(reqq->urlDest)<<endl;
mutex.V(); //exit critical region
serverURL.V(); //signal
//--------------------------------------------------------
free(reqList);
//---------------------------------------------------------------------------
}
}
В вашей клиентской ветке вы предполагаете, что urlList был выделен (или malloced) и инициализирован (эй, где вы это делаете?). Похоже, вы делаете эту конструкцию в потоке client2. Просто потому, что вы сначала запускаете поток client2, не гарантирует, что malloc произойдет до его первого использования в клиентском потоке. Подумайте об этом, прежде чем начинать нить. – user3813353