gpt4 book ai didi

C - 线程之间使用的结构体中的字段

转载 作者:行者123 更新时间:2023-11-30 19:13:04 25 4
gpt4 key购买 nike

我启动一个线程并将一个已初始化一些值的结构传递到其入口点。我得到的指针是正确的,我可以得到指向该结构中特定字段的指针,但我看到的值不是我最初设置的值。这是怎么发生的?

示例:

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

呃???

编辑:

我应该提到,如果我调用 RunContinuously 而不是在那里启动线程,它会按预期工作。想想吧。

最佳答案

我看到的一个问题是您正在分配 CNX_Algorithm 而不是 CNX_Instance 的大小。第一个是 4 个字节,而第二个可能是 16 个或更多(在 32 位系统上)。如果 4 字节分配来自与 16 字节分配不同的存储桶,则可能会导致内存损坏。

关于C - 线程之间使用的结构体中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36109633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com