我启动一个线程并将一个初始化了一些值的结构传递给它的入口点。我得到的指针是正确的,我可以获得指向该结构中特定字段的指针,但我看到的值并不是我最初设置它的值。这是怎么发生的?
示例:
typedef int (*CNX_Algorithm)(void*, int);
typedef struct
{
CNX_Algorithm algorithm;
thrd_t thread;
void *data;
int go;
} CNX_Instance;
int RunContinuously(void *instance)
{
int count = 0;
int *go = &((CNX_Instance*)instance)->go;
CNX_Algorithm algorithm = ((CNX_Instance*)instance)->algorithm;
void *data = ((CNX_Instance*)instance)->data;
printf("new thread: %p %p %p\n", instance, &((CNX_Instance*)instance)->data, data);
while(*go) count += algorithm(data, 1);
return count;
}
CNX_Instance *CNX_StartInstance(CNX_Algorithm algorithm, void *data)
{
CNX_Instance *instance = malloc(sizeof(CNX_Algorithm));
instance->algorithm = algorithm;
instance->data = data;
printf("original thread: %p %p %p\n", instance, &instance->data, instance->data);
instance->go = 1;
thrd_create(&instance->thread, RunContinuously, instance);
return instance;
}
输出:
original thread: 024b1f78 024b1f84 0019ff10
new thread: 024b1f78 024b1f84 80000008
咦???
编辑:
我应该提一下,如果我CALL RunContinuously而不是在那里启动一个线程,它按预期工作。去图。
答案 0 :(得分:1)
我看到的一个问题是你正在修改CNX_Algorithm而不是CNX_Instance的大小。第一个是四个字节,而第二个可能是16个或更多(在32位系统上)。如果4字节分配来自不同的桶,比如16字节分配,则可能是内存损坏。