[英]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.