在我看来,将数据作为文件存储在B树中的一种方法可以使用带有结构序列(数组)的二进制文件来有效地完成,每个结构代表一个节点.因此,可以使用与使用数组创建链接列表类似的方法来连接各个节点.但后来支持的问题是删除一个节点,因为在一个巨大的文件中只删除中间的几个字节是不可能的.
一种删除方法可以是跟踪"空"节点,直到达到阈值截止,然后制作另一个将丢弃空节点的文件.但这很乏味.
从简单/效率的角度来看,是否有更好的方法来删除,甚至在文件中表示B树?
TIA,-Sviiya
以下代码使用gcc(4.1.2 20080704)生成错误且不一致的输出,但使用icc(版本11.1)生成正确和预期的输出.但是当我将thread_data_array []定义从main()移动到global(紧跟在struct thread_data定义之后)时,它对两个编译器都可以正常工作.我不明白为什么这种改变应该有所不同.我想以递归方式生成线程,所以我需要从函数调用它而不是定义为全局.有人可以解释代码有什么问题吗?
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 4
struct thread_data {
int thread_id;
int sum;
};
/* struct thread_data thread_data_array[NUM_THREADS]; */
void *p_task(void *threadarg)
{
struct thread_data *my_data;
int taskid;
int sum;
my_data = (struct thread_data *) threadarg;
taskid = my_data->thread_id;
sum = my_data->sum;
printf("Thread #%d with sum %d\n", taskid, sum);
for ( sum = 0; sum < 000000000; sum++ ) {
for ( taskid = 0; taskid < 000000000; taskid++ ) {
sum+=taskid;
} …Run Code Online (Sandbox Code Playgroud)