我需要你的帮助才能在这段代码中找到问题:它是我的程序的主要功能,模拟多处理器系统。我使用线程库来构建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;
}
答案 0 :(得分:0)
加入该线程失踪。添加:
pthread_join(ram, 0);
在销毁该线程使用的资源之前的某个地方。
但是,这可能无法修复崩溃,因为你需要先以某种方式优雅地停止该线程。
答案 1 :(得分:0)
因为如果出现错误,syserr将返回。如果出现错误,它会做一些接近&#34; printf(...);出口(...);&#34;
你永远不会做其余的代码,这是假设释放所有变量。
使用&#34; strerror(错误)&#34;相反;)