Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Fork()的特殊定义将struct传递到线程中_C++_Multithreading_Struct - Fatal编程技术网

C++ 使用Fork()的特殊定义将struct传递到线程中

C++ 使用Fork()的特殊定义将struct传递到线程中,c++,multithreading,struct,C++,Multithreading,Struct,对于一个项目,我必须使用以下Fork定义:void Fork(VoidFunctionPtr func,int arg);。我需要将一个结构作为arg传入,以便为forked函数提供更多信息,但由于结构不是int,所以我不断出错。我试图将两个指向缓冲区的指针传递到线程中,以便在线程之间共享数据。如果有人知道如何欺骗函数,使其接受结构作为int或其他方式,以实现在此版本的Fork创建的线程之间共享缓冲区的目标,请告诉我。P.S.我不能使用For的C++标准版本,因为我正在做的编程非常低。 < P>

对于一个项目,我必须使用以下Fork定义:void Fork(VoidFunctionPtr func,int arg);。我需要将一个结构作为arg传入,以便为forked函数提供更多信息,但由于结构不是int,所以我不断出错。我试图将两个指向缓冲区的指针传递到线程中,以便在线程之间共享数据。如果有人知道如何欺骗函数,使其接受结构作为int或其他方式,以实现在此版本的Fork创建的线程之间共享缓冲区的目标,请告诉我。P.S.我不能使用For的C++标准版本,因为我正在做的编程非常低。

< P>这里有一些不同质量的想法。
  • 创建一个包含结构向量的单例类。将结构的特定实例放入向量并保存索引。将该索引作为int参数传递到
    Fork
    。然后,您的
    Fork
    函数可以访问单例并将结构拉出

  • 这是一个非常糟糕的主意。如果
    int
    的大小与系统上的地址大小相同,则可以将地址作为int参数传递给结构,然后将其抛出。请不要这样做


  • 这里有一些不同质量的想法

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

  • 这是一个非常糟糕的主意。如果
    int
    的大小与系统上的地址大小相同,则可以将地址作为int参数传递给结构,然后将其抛出。请不要这样做


  • 这里有一些不同质量的想法

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

  • 这是一个非常糟糕的主意。如果
    int
    的大小与系统上的地址大小相同,则可以将地址作为int参数传递给结构,然后将其抛出。请不要这样做


  • 这里有一些不同质量的想法

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

  • 这是一个非常糟糕的主意。如果
    int
    的大小与系统上的地址大小相同,则可以将地址作为int参数传递给结构,然后将其抛出。请不要这样做


  • 您可以使用reinterpret_cast(&OYourStruct),然后您可以将指向结构的指针作为int(arg)传递,但它必须是指针,而不是实际的结构,因为指针的大小与int相同,而且在任何情况下,按值传递结构都不会产生什么影响,在这种情况下,将结构强制转换为int将生成除所需结果之外的所有结果

    当您需要从函数中访问结构时,可以执行相反的操作

    YourStruct*POYourStruct=reinterpret\u cast(arg)

    您还可以使用旧的cast cast(int)&OYourStruct和(YourStruct*)参数

    < >但是,新的C++操作符被认为更安全。 实际上,在大多数系统(所有32位系统)上,int和void*都是32位的,我很确定大多数64位系统要么保留这种关系,要么在编译时警告您使用long而不是int

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


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

    您可以使用reinterpret_cast(&OYourStruct),然后您可以将指向您的结构的指针作为int(arg)传递,但它必须是一个指针,而不是实际的结构,因为指针的大小与int相同,而且还因为在任何情况下按值传递结构都不会有什么好处,在这种情况下,将结构强制转换为int将生成除所需结果之外的所有结果

    当您需要从函数中访问结构时,可以执行相反的操作

    YourStruct*POYourStruct=reinterpret\u cast(arg)

    您还可以使用旧的cast cast(int)&OYourStruct和(YourStruct*)参数

    < >但是,新的C++操作符被认为更安全。 实际上,在大多数系统(所有32位系统)上,int和void*都是32位的,我很确定大多数64位系统要么保留这种关系,要么在编译时警告您使用long而不是int

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

    我使用一个系统,其中数据指针是类型类storage_class*,并且我的所有存储类都派生自this类。及