[英]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
有幾個問題需要解決:
customer
結構上的main
線程和工作線程之間存在競爭條件 。 線程在同時嘗試訪問reservable
字段時涌入,並且不確定哪個線程首先進入該字段。
一種選擇是使main
線程在嘗試打印更新的值之前等待工作線程完成(使用pthread_join
),或者使用諸如信號量之類的條件構造來確保排序(取決於您的應用程序目標)。 始終detach
或join
線程。
customer
已經是一個指針,因此您可以按原樣將其傳遞給worker函數,而無需使用&
獲取地址,這將使其類型為Customer **
。 如果您在本地函數堆棧而不是堆上分配了customer
,則使用&
會比較合適。
...還有一些不太重要的建議...
請記住釋放customer
的內存,以免泄漏。
從worker函數返回一個void *
值。
abc
是一個令人困惑的變量名- threads
更准確。 對於t
, rc
和a
。
無需 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
創建新線程時,它獨立於主線程運行。 這意味着,沒有什么是停止printf
在main
從執行前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.