线程C分段错误是一个简单的程序

时间:2014-06-25 09:48:21

标签: c multithreading segmentation-fault pthreads

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

所以,我尝试使用gdb(没有任何响应)和valgrind找到它。 Valgrind告诉我的唯一一件事就是只有一个可能丢失的东西(这就是混乱:1个区块中的272个字节可能在丢失记录1中丢失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;

}

2 个答案:

答案 0 :(得分:0)

加入该线程失踪。添加:

pthread_join(ram, 0);

在销毁该线程使用的资源之前的某个地方。

但是,这可能无法修复崩溃,因为你需要先以某种方式优雅地停止该线程。

答案 1 :(得分:0)

因为如果出现错误,syserr将返回。如果出现错误,它会做一些接近&#34; printf(...);出口(...);&#34;

你永远不会做其余的代码,这是假设释放所有变量。

使用&#34; strerror(错误)&#34;相反;)