我必须学习POSIX线程,仍然能够理解指针和解引用,我想我理解& amp; *和更改值/内存位置。现在我们必须开始编码POSIX线程,我们在我们的讲座中给出了这个示例问题,但我无法得到正在发生的事情。
显然这段代码存在问题,可能与解析参数有关,有人可能会给我一个快速解释吗?我评论了我的想法
library(data.table)
DT <- data.table(dates1, dates2)
DT[,seq(dates1, dates2, by= '1 day') , by = 1:nrow(DT)]$V1
#[1] "2015-10-01" "2015-10-02" "2015-10-03" "2015-03-27" "2015-03-28"
#[6] "2015-05-20" "2015-05-21" "2015-05-22"
调用pthread_create时,是否将线程参数传递给add方法?如果这段代码有什么问题怎么办?
答案 0 :(得分:3)
void * add(void *p_in)
是一个将void指针作为参数并返回void指针的函数。有些人发现这种编码风格更具可读性:void* add (void* p_in)
(等效含义)。
void*
的优点是可以指向任何类型的通用指针。并且任何指针类型都可以在没有显式强制转换的情况下转换为void指针类型。所以一个函数都返回void *并将void *作为参数,这是你可以拥有的最通用的函数。
(强制转换(void *)&p
是多余的:它是多余的,可能表明你做错了,比如在C ++编译器上编译C代码。)
POSIX线程要求在创建线程时将函数指针传递给具有这种格式的函数。这将是线程回调功能。它必须具有确切的格式,否则您的程序将崩溃并刻录。
如果需要传递几个参数,则必须在结构中将它们一起烘焙,如示例所示,然后从回调函数内部将它们转换回结构类型。
关于phread_create的参数,手册可以告诉你和I一样多。基本上它是这样的:
pthread_create(&t, // thread to create
NULL, // attributes, advanced feature, ignore for now
add, // thread callback function
&p); // pointer to the parameter to pass to the thread callback
返回0是一种写回返NULL的草率方式。这在C中是不好的做法,最好总是使用NULL宏。
答案 1 :(得分:2)
add
之前的*表示add
返回void*
- 即指针。它必须返回void*
而不是其他类型或无效的原因是,pthread_create
调用的函数必须返回。
与您的评论相反,函数add
不无效。它返回一个void *
的值。我建议快速使用void *
指针。
您可以(并且应该)查找pthread_create
的参数,这将回答您关于其参数的问题。最后一个参数作为参数传递给add
。
告诉你作业的答案可能不是帮助你学习的最好方法......但是现在就是这样。想一想范围并在阅读我的答案之前尝试自己解决。
我可以看到一个错误 -
adder
变量p
的范围是adder
的本地范围。您将指向它的指针传递给add
。只要adder
返回,p
就会超出范围,add
会处理可能不包含您想要的内存的内存。
可能还有其他人我没有发现。
答案 2 :(得分:2)
是什么类型的参数(void * p_in)?
那是一个void pointer,基本上是一个没有与之关联的类型的指针。 POSIX线程只接受void指针作为参数,要使用它们,你必须cast它们到你想要的类型,这就是在add()的第一行做了什么。
代码失败,因为p是一个局部变量,一旦adder返回就被丢弃(因为add()是一个线程,adder()不等待它返回),修复它要么是pa全局变量,要么make adder()等到add()线程返回
编辑:正如Martin James指出的那样,用malloc动态分配p,将结果指针传递给线程并在线程末尾调用free也可以解决问题。
答案 3 :(得分:0)
不要在创建线程的功能块中的自动存储中分配线程参数struts / objects /,除非创建函数/块的生命周期保证与创建的时间相同或更长线程需要访问它。