簡體   English   中英

如何從線程返回結構?

[英]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的內存中。 換句話說,您寫給dstruct 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()的代碼還可以,

  • 所有這些強制轉換,在C語言中完全沒有用
  • 以及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.

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