[英]How do I return a struct from a thread?
我正在嘗試學習如何從線程中返回一些值,但是我沒有成功。 我在代碼中考慮過,我無法返回全局變量,所以我從malloc
獲取內存,但是pthread_join
顯然存在問題。
#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
struct DIRECCION{
char street [20];
int number;
} ;
struct DIRECCION * pd = NULL;
void* show(void* dm){
struct DIRECCION * di = (void*)dm;
pd=(struct DIRECCION*)malloc(sizeof(struct DIRECCION));
printf("\nHilo show\n");
printf("Calle: %s\t",di->street);
printf("Altura: %d\n",di->number);
printf("Calle: ");
scanf("%s",pd->street);
printf("Altura: ");
scanf("%d",&(pd->number));
printf("me jui\n");
return((void*)pd);
}
int main (void){
pthread_t s_id;
struct DIRECCION dm;
struct DIRECCION d ;
printf("\nProceso\n");
printf("Calle: ");
scanf("%s",dm.street);
printf("Altura: ");
scanf("%d",&(dm.number));
pthread_create( &s_id , NULL, (void*)&show, (void*)&dm);
pthread_join( s_id , (void*)&d );
printf("Calle: %s\t",(d.street));
printf("Altura: %d\n",(d.number));
free(pd);
return 0;
}
第一步-擺脫所有演員陣容。 您不需要它們,它們會隱藏您從編譯器中獲得的錯誤,這些錯誤會告訴您確切的操作錯誤。
當您執行此操作時,您會立即發現問題出在調用pthread_join
-您試圖在需要void **
時使用struct DIRECCION *
對其進行調用。 要修復它,您需要傳遞一個void **
,這意味着您需要一個void *
來獲取以下地址:
void *tmp;
struct DIRECCION *d;
pthread_join( s_id , &tmp );
d = tmp;
... do stuff with d->whatever
在線程函數中,您具有:
pd=(struct DIRECCION*)malloc(sizeof(struct DIRECCION));
return((void*)pd);
也就是說返回您分配的內存地址。 然后,在您的主要功能中
struct DIRECCION d ;
pthread_join( s_id , (void*)&d );
就是說將線程函數返回的值寫到存儲d
的內存中。 換句話說,您寫給d
是struct DIRECCION*
,而不是struct DIRECCION
。
嘗試類似
#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
struct DIRECCION{
char street [20];
int number;
} ;
void* show(void* dm){
struct DIRECCION * pd = NULL;
struct DIRECCION * di = (void*)dm;
pd=(struct DIRECCION*)malloc(sizeof(struct DIRECCION));
printf("\nHilo show\n");
printf("Calle: %s\t",di->street);
printf("Altura: %d\n",di->number);
printf("Calle: ");
scanf("%s",pd->street);
printf("Altura: ");
scanf("%d",&(pd->number));
printf("me jui\n");
return((void*)pd);
}
int main (void){
pthread_t s_id;
struct DIRECCION dm;
struct DIRECCION* d ;
printf("\nProceso\n");
printf("Calle: ");
scanf("%s",dm.street);
printf("Altura: ");
scanf("%d",&(dm.number));
pthread_create( &s_id , NULL, (void*)&show, (void*)&dm);
pthread_join( s_id , (void**)&d );
printf("Calle: %s\t",(d->street));
printf("Altura: %d\n",(d->number));
free(d);
return 0;
}
除了show()
的代碼還可以,
以及pd
是全局定義的事實
struct DIRECCION * pd = NULL; void* show(void* dm) { ...
這不是必需的。 在本地將pd
定義為show()
:
void* show(void* dm) { struct DIRECCION * pd = dm; ...
在main()
,清除show()
返回的指針值的一種干凈方法是:
int main(void)
{
...
{
void * pv;
pthread_join(s_id, &pv);
/* Find the value inside pv here. */
}
如上所述,通過pthread_join()
檢索指針值有兩種可能性:
像這樣使用指針值:
int main(void) { struct DIRECCION * pd; ... { void * pv; pthread_join(s_id, &pv); pd = pv; } printf("Calle: %s\\t", pd->street); ...
解引用指針值並將其指向的內容復制到合適的結構中(此后不再需要指向的內存,因此請釋放它以免泄漏):
int main(void) { struct DIRECCION d; ... { void * pv; pthread_join(s_id, &pv); d = *((struct DIRECCION *) pv); /* The only cast necessary in fact. */ free(pv); /* This frees what has been allocated in `show()`. */ } printf("Calle: %s\\t", d.street); ...
請注意, pthread_join()
可能會失敗,因此強烈建議測試失敗時返回的值。
如果pthread_join()
成功通過了指針值,則返回的值可能仍為NULL
,因此在取消引用指針值之前必須進行測試。
因此,一種安全的方法(嘗試從pthread_join()
提取指針值pthread_join()
將是:
int main(void)
{
...
{
void * pv;
int result = pthread_join(s_id, &pv);
if (0 != result)
{
fprintf("pthread_join() failed: %s\n", strerror(result));
exit(EXIT_FAILURE); /* EXIT_x come with stdlib.h. */
}
if (NULL == pv)
{
/* Handle this case here or exit() as well. */
}
else
{
/* Use the value inside pv here. */
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.