多线程 C qsort 字符数组
Multithread C qsort char array
我正在尝试按 C 中的键对一些记录进行排序。
有M条记录,每条记录的语法为:
密钥 v -------- 数据 v
1234abcd。 abcdefghijklmnopqrstuvwxyzzzzzzzzzz
每条记录都有一个 8 字节的十六进制键值,后跟 64 字节的数据
过程如下:
- 打开文件
- 创建文件的内存映射
- 现在内存中有巨大的char *,创建N个线程
- 使用 N 个线程对 M/N 条记录进行排序
- 合并相邻的排序分区,即。 0 和 1、2 和 3
现在我正在尝试定位 qsort 函数中的键,但出现分段错误。
我的打开文件成功后的代码
if((fstat(fileNum, &sb)) == -1) {
printf("fstat fail");
exit(-1);
}
int sb_size = sb.st_size;
int num_records = sb_size/REC_SIZE;
printf("SB SIZE: %d\n", sb_size);
printf("num_records: %d\n", num_records);
addr = (char *)mmap(NULL, sb_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileNum, 0);
if (addr == MAP_FAILED) {
close(fileNum);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}
int num_records_per_thread = num_records/num_threads;
printf("Number of Records per Thread = %d\n", num_records_per_thread);
qsort(addr, num_records_per_thread, REC_SIZE, compare);
int compare(const void *a, const void *b) {
struct mRecord rec1, rec2;
char *keya;
strncpy(keya, (char *)a, 8);
printf("in Compare: first 8 bytes are: %s", keya);
return 1;
}
这给了我一个分段错误。我怎样才能只定位键并对它们进行排序?
非常感谢。
1)不能用strncpy拷贝keya上的变量a,因为keya是一个未初始化的指针!
2) 函数比较必须return一个比较值!
然后在比较函数里面你可以这样写:
return strncmp( (char *)a, (char *)b, 8 ); //8 is the key length!
我正在尝试按 C 中的键对一些记录进行排序。
有M条记录,每条记录的语法为:
密钥 v -------- 数据 v
1234abcd。 abcdefghijklmnopqrstuvwxyzzzzzzzzzz
每条记录都有一个 8 字节的十六进制键值,后跟 64 字节的数据
过程如下:
- 打开文件
- 创建文件的内存映射
- 现在内存中有巨大的char *,创建N个线程
- 使用 N 个线程对 M/N 条记录进行排序
- 合并相邻的排序分区,即。 0 和 1、2 和 3
现在我正在尝试定位 qsort 函数中的键,但出现分段错误。
我的打开文件成功后的代码
if((fstat(fileNum, &sb)) == -1) {
printf("fstat fail");
exit(-1);
}
int sb_size = sb.st_size;
int num_records = sb_size/REC_SIZE;
printf("SB SIZE: %d\n", sb_size);
printf("num_records: %d\n", num_records);
addr = (char *)mmap(NULL, sb_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fileNum, 0);
if (addr == MAP_FAILED) {
close(fileNum);
perror("Error mmapping the file");
exit(EXIT_FAILURE);
}
int num_records_per_thread = num_records/num_threads;
printf("Number of Records per Thread = %d\n", num_records_per_thread);
qsort(addr, num_records_per_thread, REC_SIZE, compare);
int compare(const void *a, const void *b) {
struct mRecord rec1, rec2;
char *keya;
strncpy(keya, (char *)a, 8);
printf("in Compare: first 8 bytes are: %s", keya);
return 1;
}
这给了我一个分段错误。我怎样才能只定位键并对它们进行排序? 非常感谢。
1)不能用strncpy拷贝keya上的变量a,因为keya是一个未初始化的指针!
2) 函数比较必须return一个比较值!
然后在比较函数里面你可以这样写:
return strncmp( (char *)a, (char *)b, 8 ); //8 is the key length!