posix线程程序说明?

时间:2015-08-12 12:52:37

标签: c multithreading pointers pthreads posix

我必须学习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方法?如果这段代码有什么问题怎么办?

4 个答案:

答案 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 /,除非创建函数/块的生命周期保证与创建的时间相同或更长线程需要访问它。