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