如何解决尝试将结构的实例传递给具有整数和双精度值的线程函数
我正尝试将结构的实例传递给线程,但由于某种原因,它正在为整数打印随机值,但为double值正确吗?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//Pass an integer value and a double value to a thread (use struct!)
typedef struct param {
int val;
double db;
}param_t;
void *myth(void *arg)
{
param_t myT,*myPt;
myT = *((param_t*)arg);
myPt = (param_t*)arg;
printf("%d\n",myT.val);
printf("%.3lf\n",myPt->db);
pthread_exit(NULL);
}
void main()
{
pthread_t tid;
int i = 3733;
double d = 3733.001;
param_t t_struct;
param_t *p;
p = malloc(sizeof(param_t));
*p = t_struct;
t_struct.val = i;
t_struct.db = d;
pthread_create(&tid,NULL,myth,(void *)&p);
pthread_join(tid,NULL);
return;
}
输出: 10969104 3733.001
解决方法
一个问题在这里:
*p = t_struct;
t_struct.val = i;
t_struct.db = d;
第一个分配复制未初始化的结构t_struct
。然后,您初始化t_struct
,但这仅初始化t_struct
本身。它不会修改p
指向的副本。
然后通过将指针传递到指针,使情况变得更糟。这意味着在线程函数myth
中,参数arg
根本没有指向结构。当您取消引用指针时,这会导致未定义的行为。
我的建议是完全不要去烦p
或动态分配。而是将指针传递到原始结构t_struct
:
pthread_create(&tid,NULL,myth,& t_struct);
,
这没有意义:
param_t t_struct;
param_t *p;
p = malloc(sizeof(param_t));
*p = t_struct; // t_struct isn't initialized,so this is undefined behaviour.
t_struct.val = i; // Has no effect on `p` or `*p`.
t_struct.db = d; // Has no effect on `p` or `*p`.
也许你要去
param_t t_struct;
param_t *p;
p = malloc(sizeof(param_t));
t_struct.val = i;
t_struct.db = d;
*p = t_struct;
以下内容会更好:
param_t t_struct;
t_struct.val = i;
t_struct.db = d;
param_t *p = &t_struct;
您还可以使用以下内容:
param_t *p = malloc(sizeof(param_t));
p->val = i;
p->db = d;
与先前的解决方案不同,后一种解决方案不需要t_struct
才能保持存在,直到加入线程为止
还有第二个问题。
arg
实际上是param_t **
,但是您将其视为param_t *
。
已修复:
void *myth(void *arg) // arg is really a param_t *
{
param_t *p = (param_t*)arg;;
printf("%d\n",p->val);
printf("%.3lf\n",p->db);
pthread_exit(NULL);
}
pthread_create(&tid,p);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。