【发布时间】:2013-09-08 20:20:44
【问题描述】:
我有一个 MyLib.h,其中有
typedef void *MyThread;
还有一个 MyLib.c,它有:
typedef struct
{
ucontext_t *context;
int tid;
}_MyThread;
有一个测试函数可以创建一个线程并发出一个连接:
void f0(void * dummy)
{
MyThread t1;
printf("f0 start\n");
t1 = MyThreadCreate(f1, NULL);
_MyThread *t = (_MyThread*)t1;
printf("passed value=%d\n",t->tid);
printf("f0 join on t1\n");
MyThreadJoin(t1);
....
}
MyLib.c中的MyThreadCreate和MyThreadJoin如下:
MyThread MyThreadCreate(void(*start_funct)(void *), void *args)
{
_MyThread child_thread;
...
//setting the child thread's tid
child_thread.tid = ++active_threads;
... MyThread ret = (MyThread)&child_thread;
return ret;
}
int MyThreadJoin(MyThread thread)
{
_MyThread *arg_thread;
arg_thread = (_MyThread*)thread;
int id = arg_thread->tid;
....
}
我的问题是,当我运行上述内容时,我得到:
passed value=2
f0 join on t1
arg_thread->tid = 13
传递的值 = "2" 是正确的,但是库函数中出现的值 "13" 是错误的。为什么传递的值以相同的方式解引用,与调用函数不同,在被调用函数中不同?
【问题讨论】:
-
您将一个指针传递给一个指针 (a
void**),但该函数接受一个指针 (avoid*)。 (编辑:实际上,也许不是。仍在尝试理解您的代码……) -
好吧,你将
void*转换为void**,而不是指向它。你应该做t = &t1和arg_thread = &thread;。使用您当前的代码,您正在到处切换指针类型并弄乱内存。 -
传递的值,即函数 f0 是正确的。但是,它在 MyThreadJoin 函数中打印错误。
-
您是否将相同的结构传递给不同的线程?如果是这样,您就会遇到同步问题。
-
正如我所说,你的演员阵容是错误的。无需使用任何类型转换即可编写此代码。尝试这样做,您的问题就会消失。今后,我强烈建议不要将指针隐藏在 typedef 后面,并使用前向声明而不是使用
void指针。
标签: c pointers void-pointers