簡體   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