【问题标题】:Multithread C qsort char array多线程 C qsort char 数组
【发布时间】:2015-04-13 23:56:55
【问题描述】:

我正在尝试按 C 中的键对一些记录进行排序。

M条记录,每条记录的语法为:

KEY v -------- DATA v

1234abcd。 abcdefghijklmnopqrstuvwxyzzzzzzzzzz

每条记录都有一个 8 字节的十六进制键值,后跟 64 字节的数据

流程如下:

  • 打开一个文件
  • 创建文件的内存映射
  • 现在在内存中使用巨大的 char *,创建 N 个线程
  • 使用 N 个线程对 M/N 个记录进行 qsort
  • 合并相邻的排序分区,即。 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;
    }

这给了我一个分段错误。我怎样才能只定位键并对它们进行排序? 非常感谢。

【问题讨论】:

  • 与您的问题和问题无关,但是在检查errno 时,请在失败的函数调用后立即执行此操作,最重要的是不要调用另一个可能会在两者之间改变errno 的函数。我之所以提到这一点,是因为如果mmap 失败,您调用close,这可能 失败并因此改变errno 值。在close 之前致电perror

标签: c multithreading pthreads mmap qsort


【解决方案1】:

1) 不能使用 strncpy 复制 keya 上的变量 a,因为 keya 是一个未初始化的指针!

2) 函数 compare 必须返回一个比较的值!

那么在函数 compare 里面你可以写:

return strncmp( (char *)a, (char *)b, 8 ); //8 is the key length!

【讨论】:

  • 我应该澄清一下。我还没有实现比较功能。我只是想看看进入函数的数据是什么样的。如果我做了 printf("a = %s", a);我会得到整个 char 数组,而不仅仅是单个记录。排序不起作用。
  • 好的!然后你必须声明:char keya[9],而不是 char * keya。如果你使用 char * keya 它在内存中随机指向,它没有被分配! (我认为 strncpy 也应该不同,可能是 9 而不是 8 - 但我不确定)
  • 啊,想通了。我用 char test[8] = a 进行了调试,发现问题出在我的记录大小上。非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 2018-10-15
  • 1970-01-01
  • 2023-03-22
  • 2013-06-16
  • 2011-03-30
  • 2020-05-09
  • 2020-03-05
相关资源
最近更新 更多