繁体   English   中英

C - 线程退出将变量设置为 0

[英]C - Thread exit sets variable to 0

以下主要,我希望发现等于假,它是。 但是, main 的treeInfo->elem中的最终打印不是6而是0 我不明白这怎么可能。 变量绝不会设置为 0。任何建议都将不胜感激。

int main() {
pthread_mutex_init(&myMutex, NULL);
pthread_t threads[5];
nodeinfo_t * treeInfo = malloc(sizeof(nodeinfo_t));

int myInt = 5;
int myIntTwo = 6;
int found;
treeInfo->elem = &myIntTwo;
node_t * myTree = createTree(&myInt);
treeInfo->node = myTree;

pthread_create(&threads[3],NULL,search,treeInfo);
pthread_join(threads[3],(void *) &found);

printf("THE VALUE OF ELEM IS %d", *(treeInfo->elem));
}
int search(void * args) {
    nodeinfo_t * nodeInfo = (nodeinfo_t *) args;
    node_t * node = nodeInfo->node;
    int * toFind = nodeInfo->elem;
    
    if (node == NULL) {
        pthread_mutex_unlock(&myMutex);
        return 0;
    }
    
    if (node->parent == NULL) {
        pthread_mutex_lock(&myMutex);
    }

    if (node->elem == *toFind) {
        pthread_mutex_unlock(&myMutex);
        return 1;
    } else if (node->elem< *toFind) {
        nodeInfo->node = node->right;
        return search(nodeInfo);
    } else if (node->elem > *toFind) {
        nodeInfo->node = node->left;
        return search(nodeInfo);
    }
}

编辑:可重现

typedef struct _node {
    int elem;
    struct _node * parent;
    struct _node * left;
    struct _node * right;
} node_t;

typedef struct _nodeinfo {
    node_t * node;
    int * elem;
} nodeinfo_t;

pthread_mutex_t myMutex;

node_t * createTree(int * firstElem) {
    // allocate memory in heap for size of node type
    node_t * root = malloc(sizeof(node_t));
    // set element of root to first int in tree
    root->elem = *firstElem;
    // set everything else blank
    root->left = NULL;
    root->right = NULL;
    root->parent = NULL;
    // return pointer to start of tree node
    return root;
}

问题是您认为线程函数返回int值。 它们实际上确实返回了指针(更具体地说是void * )。

如果您在启用警告的情况下进行构建,您应该会收到一条警告,指出search function 与pthread_create期望的不匹配。

pthread_join function 需要一个指向void **类型指针的指针

这种返回类型的不匹配将导致未定义的行为


要解决您的问题,您需要从search function 中返回一个指针。 但是,这是通常认为可以通过特殊类型转换将值转换为指针的情况之一。

例如:

void *search(void * args) {
    nodeinfo_t * nodeInfo = (nodeinfo_t *) args;
    node_t * node = nodeInfo->node;
    int * toFind = nodeInfo->elem;
    
    if (node == NULL) {
        pthread_mutex_unlock(&myMutex);
        return (void *) (intptr_t) 0;  // Note the double casting here
    }

    // ...
}

然后您需要使用指针来获取返回值,并执行相反的转换来获取值:

void *found_ptr;
pthread_join(threads[3], &found_ptr);
int found = (int) (intptr_t) found_ptr;

至于可能发生的情况是您在 64 位系统上,其中指针是 64 位,但int只有 32 位。 这种大小不匹配将导致堆栈粉碎错误,其中变量myIntTwo被线程的返回值覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM