将struct传递给具有Fork()特殊定义的线程

时间:2015-10-01 01:43:04

标签: c++ multithreading struct

对于一个项目,我必须使用以下Fork的定义:void Fork(VoidFunctionPtr func,int arg);.我需要传递一个struct作为arg,这样我就可以为forked函数提供更多信息,但是我一直得到错误,因为struct不是int。我试图将两个指向缓冲区的指针传递给线程,以便在线程之间共享数据。如果有人知道如何欺骗函数接受struct作为int或另一种方法来实现在这个版本的Fork创建的线程之间拥有共享缓冲区的目标,请告诉我。附:我不能使用Fork的C ++标准版本,因为我正在进行的编程非常低级。

2 个答案:

答案 0 :(得分:2)

以下是一些不同质量的想法。

  1. 创建一个包含结构向量的单例类。将结构的特定实例放入向量并保存索引。将该索引作为int参数传递给Fork。然后,您的Fork函数可以访问单例并将结构拉回来。

  2. 理论上更糟糕。如果int的大小与系统上的地址大小相同,则可以将地址作为int参数传递给结构,然后将地狱输出。请不要这样做。

答案 1 :(得分:1)

你可以使用reinterpret_cast< int>(& OYourStruct),然后你可以将一个指针作为int(arg)传递给你的结构,但是它是一个指针而不是实际的结构,因为指针与int的大小相同,也因为在任何情况下,通过值传递结构都会很少,在这种情况下,将结构转换为int将生成除了所需结果之外的所有结构。

当你需要从函数中访问你的结构时,你可以反向执行

YourStruct * POYourStruct = reinterpret_cast< YourStruct *>(arg);

你也可以使用旧案例cast(int)& OYourStruct和(YourStruct *)arg

但据说较新的C ++运营商更安全。

实际上在大多数系统(所有32位系统)上int和void *都是32位,我很确定大多数64位系统要么保留这种关系,要么在编译时给你一个警告来使用long而不是一个int。

但更好的解决方案实际上是将int arg与void *交换。然后,您可以指向任何数据(也是结构),这保证可以在所有系统上运行。 你仍然需要重铸,但这是使用纯C时通常解决这个问题的方法。

我使用的是一个系统,其中数据指针是类型类storage_class *,并且我的所有存储类都是从这个类派生的。然后你将你的基类指针转换为你知道它的派生指针,这应该是非常安全的。只需回想一下您指向的派生类ptr。