C - 线程之间使用的struct中的字段

时间:2016-03-20 02:32:56

标签: c multithreading pointers struct

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

示例:

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而不是在那里启动一个线程,它按预期工作。去图。

1 个答案:

答案 0 :(得分:1)

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