【问题标题】:Thread C segmentation fault a simple program线程C分段错误一个简单的程序
【发布时间】:2014-08-15 19:42:54
【问题描述】:

我需要您的帮助来找出这段代码中的问题:它是我的程序的主要功能,它模拟了一个多处理器系统。我使用线程库来构建 Ram 实体和所有 CPU。编译没有问题,并且大多数执行都运行良好。但是,有时,我启动 exe 并打印一两次后,出现分段错误。

所以,我尝试使用 gdb(没有任何响应)和 valgrind 找到它。 Valgrind 告诉我的唯一一件事是只有一个可能丢失(这是消息:1 个块中的 272 个字节可能在丢失记录 1 of 1 中丢失)。

附言。我为每个库函数编写#include。

int main(int argc, char *argv[])
{
  if(argc!=3)
  syserr("Utilizzo: simulazione <numCpu> <ramDim>\n");

  pthread_t ram;
  ram_dim=atoi(argv[2]);

  int num_cpu=atoi(argv[1]);
  pthread_t cpu[num_cpu];

  command *cpu_info=(command *) malloc(sizeof(command)*num_cpu);
  request *buffer=(request *) malloc(sizeof(request));

  int curs, status;
  pthread_attr_t attr;

  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

  pthread_mutex_init(&ram_lock, NULL);
  vpthread_mutex_lock(&ram_lock);

  if((status=pthread_create(&ram, &attr, ram_job, (void *) buffer))!=0)
    syserr("Creazione thread Ram fallita.\n");

  pthread_mutex_init(&cpu_lock, NULL);
  pthread_mutex_init(&rw_lock, NULL);
  pthread_mutex_lock(&rw_lock);

  for(curs=0;curs<num_cpu;curs++)
  {
    cpu_info[curs].istr=buffer;
    cpu_info[curs].num_cpu=curs+1;

    if((status=pthread_create(&cpu[curs], &attr, cpu_job, (void *) &cpu_info[curs]))!=0)
        syserr("Creazione thread Cpu fallita.\n");
  }

  pthread_attr_destroy(&attr);

  for(curs=0;curs<num_cpu;curs++)
    pthread_join(cpu[curs], (void **) 0);

  free(buffer);
  free(cpu_info);
  pthread_mutex_destroy(&rw_lock);
  pthread_mutex_destroy(&cpu_lock);
  pthread_mutex_destroy(&ram_lock);

  return 0;

}

【问题讨论】:

  • 是什么让你认为 bug 是在 main 而不是在线程函数中?
  • 因为 Valgrind 对我说 main 中只有内存泄漏,正好在这一行: if((status=pthread_create(&ram, &attr, ram_job, (void *) buffer))!= 0)

标签: c multithreading segmentation-fault pthreads


【解决方案1】:

缺少加入该线程。添加:

pthread_join(ram, 0);

在您销毁该线程使用的资源之前的最后某个位置。

但这可能无法解决崩溃问题,因为您首先需要以某种方式优雅地停止该线程。

【讨论】:

    【解决方案2】:

    因为如果出现错误,syserr 会返回。如果出现错误,它会执行类似于“printf(...); exit(...);”的操作。

    而且你永远不会做剩下的代码,这是假设释放所有变量。

    改用“strerror(errno)” ;)

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      相关资源
      最近更新 更多