2014-10-17 4 views
0

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

Он будет запускать первый метод, а затем линию 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 был выделен (или malloced) и инициализирован (эй, где вы это делаете?). Похоже, вы делаете эту конструкцию в потоке client2. Просто потому, что вы сначала запускаете поток client2, не гарантирует, что malloc произойдет до его первого использования в клиентском потоке. Подумайте об этом, прежде чем начинать нить. – user3813353

ответ

1

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

Смежные вопросы