ошибка сегментации при работе с потоками

Я получаю эту ошибку сегментации.

Он запустит первый метод, а затем строку 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);
//---------------------------------------------------------------------------

}
}

0

Решение

Вероятно, проблема возникает из-за того, что вы не синхронизируете доступ к urlList,
В client2 вы распределяете urlList а затем доступ к нему в clientОднако, нет никакой гарантии порядка выполнения двух потоков. Рассмотрите возможность использования примитивов синхронизации для управления доступом к urlList чтобы убедиться, что он выделен до того, как к нему обращаются

1

Другие решения


По вопросам рекламы [email protected]