[英]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.