簡體   English   中英

如何通過使用線程來更改函數中的struct變量?

[英]How can I change struct's variable in function by using threads?

我想將thread函數中的struct變量更改為global 但這是行不通的。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 1

typedef struct{
int id;
int reservable;
}Customer;


void *CustomerFunc(void *customer){
Customer *a;
a = (Customer *)customer;
  printf("reservable %d", a->reservable);
a->reservable = 5;
}


int main (int argc, char *argv[]) {
pthread_t abc[NUM_THREADS];
int rc; 
long t;
Customer *customer = (Customer*)malloc(sizeof(Customer));
customer->id = 1;
customer->reservable = 2;

rc = pthread_create(&abc[0],NULL,CustomerFunc,(void *)&customer);

printf("reservable MAIN%d", customer->reservable);
pthread_exit(NULL);


}

此代碼結果是:

reservable: 0 reservable MAIN: 2

但我想看看:

reservable: 2 reservable MAIN: 5

有幾個問題需要解決:

  1. customer結構上的main線程和工作線程之間存在競爭條件 線程在同時嘗試訪問reservable字段時涌入,並且不確定哪個線程首先進入該字段。

    一種選擇是使main線程在嘗試打印更新的值之前等待工作線程完成(使用pthread_join ),或者使用諸如信號量之類的條件構造來確保排序(取決於您的應用程序目標)。 始終detachjoin線程。

  2. customer已經是一個指針,因此您可以按原樣將其傳遞給worker函數,而無需使用&獲取地址,這將使其類型為Customer ** 如果您在本地函數堆棧而不是堆上分配了customer ,則使用&會比較合適。

...還有一些不太重要的建議...

  1. 請記住釋放customer的內存,以免泄漏。

  2. 從worker函數返回一個void *值。

  3. abc是一個令人困惑的變量名- threads更准確。 對於trca

  4. 無需 malloc的返回值。

這是更新的版本:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#define NUM_THREADS 1

typedef struct {
    int id;
    int reservable;
} Customer;

void *CustomerFunc(void *arg) {
    Customer *customer = (Customer *)arg;
    printf("reservable %d\n", customer->reservable);
    customer->reservable = 5;
    return NULL;
}

int main(int argc, char *argv[]) {
    pthread_t threads[NUM_THREADS];
    Customer *customer = malloc(sizeof(Customer));
    customer->id = 1;
    customer->reservable = 2;

    pthread_create(&threads[0], NULL, CustomerFunc, customer);
    pthread_join(threads[0], NULL);

    printf("reservable MAIN %d\n", customer->reservable);
    free(customer);    
    return 0;
}

輸出:

reservable 2
reservable MAIN 5

創建新線程時,它獨立於主線程運行。 這意味着,沒有什么是停止printfmain從執行前CustomerFunc作出任何改變。

解決此問題的一種簡單方法是讓主線程通過調用pthread_join等待新線程完成。

您也沒有正確地將customer傳遞給pthread_create &customer類型為Customer **但是您的線程函數需要的是Customer * ,因此請刪除操作符&的地址。

rc = pthread_create(&abc[0],NULL,CustomerFunc, customer);
pthread_join(abc[0], NULL);

printf("reservable MAIN%d", customer->reservable);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM