QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1094|回复: 11

创建新线程时遇到的问题

[复制链接]
发表于 2003-3-25 17:52:25 | 显示全部楼层 |阅读模式
一个函数
void run()
{
    printf("1");
}

然后用pthread_create(&m_thread, NULL, (void *)run,NULL);
结果编译报错:
invalid conversion from void* to void*(*)(void *)
如果用pthread_create(&m_thread, NULL, run,NULL);
则报错invalid conversion from void(*)() to void*(*)(void *)
可是书上的例子明明白白是用第一种方法的啊?
发表于 2003-3-25 18:59:59 | 显示全部楼层
pthread_create(&m_thread, NULL, (void *)run,NULL);
改为
pthread_create(&m_thread, NULL, (void *)&run,NULL);

或者定义
void run()

void* run()
回复

使用道具 举报

 楼主| 发表于 2003-3-26 10:25:13 | 显示全部楼层
不行的。
回复

使用道具 举报

发表于 2003-3-31 12:41:30 | 显示全部楼层
直接取地址,不用转换

pthread_create(&threadid,NULL,&run,NULL);
回复

使用道具 举报

发表于 2003-3-31 23:01:45 | 显示全部楼层
change u run to    void *run(void *argv)

then use pthread_create(&m_thread, NULL, run, (void *)foo)). foo should be the parameter u want to transfer to run. use NULL if no parameter.

good luck.
回复

使用道具 举报

 楼主| 发表于 2003-4-1 08:43:33 | 显示全部楼层
楼上的是一种办法,但有时候函数并不需要返回值和参数,最好解决办法就是:
typedef void*(*PFUN_RUN)(void *)。
然后pthread_create(&m_thread, NULL, (PFUN_PVOID_PVOID)run, (void *)foo))就搞定了
回复

使用道具 举报

发表于 2003-4-1 09:37:34 | 显示全部楼层
hehe, i am confused. which one is easier and more understandable?
回复

使用道具 举报

 楼主| 发表于 2003-4-1 09:58:44 | 显示全部楼层
下面一个解决方法用来了函数指针,有点难以理解。但是适用性比较广吧。     
回复

使用道具 举报

发表于 2003-4-1 10:09:46 | 显示全部楼层
the reason why pthread_create use this is to make things clear. i agree that u can use function pointer to solve the problem, but
if u fn has no parameter, u can ignore that foo
if u fn has one param, u still need convert from void*
if u fn has two more param, u can not use fn pointer to solve the problem.

and more, a simple fn pointer with type cast will give code readers a misundertanding about what type of fn he must and can supply. u still have to explain somewhere that u fn pointer method can only be used for ...
so i believe a good code style will not like this.
回复

使用道具 举报

 楼主| 发表于 2003-4-1 10:56:11 | 显示全部楼层
对于超过一个参数的问题,我的确没有办法,但用你的方法,好像也不能解决这个问题。我的程序实际上传递到线程的参数超过5个,所以我使用struct来解决这个问题。

你的方法实际上是我第一个方法用以解决类型不匹配的方法,但我总觉得这个方法缺少灵活性。要求每个函数严格按照他的格式来写,如果我需要修改一个系统,把原先的单线程模拟出来的多线程改成真正多线程,如果第一个方法,实际上工作量很多的。我需对每个函数去修改。

不可否认,第一个方法对程序的结构,易阅读性都有非常多的好处。但我想,一个程序员,应该能读懂我现在采用的方法的。权衡一下,我还是采用了函数指针的方式。
回复

使用道具 举报

发表于 2003-4-1 11:05:07 | 显示全部楼层
yes, for more than one parameters, u need to use struct. many places use such a void* to achieve this purpose.
depends on what u want, u can choose flexibility or easy to read. that is why there are many goto in kernel code.
回复

使用道具 举报

 楼主| 发表于 2003-4-1 11:15:44 | 显示全部楼层
呵呵,有时间效率比程序可读性更重要。我也想写一些读起来舒服的程序。但是对于嵌入式系统,永远是效率第一   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 06:44 , Processed in 0.037044 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表