【问题标题】:segmentation fault when working with threads使用线程时出现分段错误
【发布时间】:2014-12-12 13:03:50
【问题描述】:

我得到了这个分段错误。

它将运行第一种方法,然后运行第二种方法的 printf 行,然后直接进入分段错误。 我不明白为什么...我取消了之前的分配。 我的第二种方法运行的那一刻,它会输出prinf语句:client then segmentation fault

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 会在它第一次在客户端线程中使用之前发生。考虑在启动任一线程之前进行构造。

标签: c++ pointers operating-system segmentation-fault nachos


【解决方案1】:

问题可能是因为您没有同步对urlList 的访问。 在client2 中,您正在分配urlList,然后在client 中访问它,但是不能保证两个线程的执行顺序。考虑使用同步原语来控制对urlList 的访问,以确保在访问之前分配它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    相关资源
    最近更新 更多