【问题标题】:Using beginthread with structure of pointers in C++在 C++ 中使用带有指针结构的 beginthread
【发布时间】:2014-08-22 13:15:52
【问题描述】:

我正在做一个项目,在该项目中我必须使用指针结构作为线程的输入参数。我的代码如下所示:

struct coord
{
    double* xPos;
    double* yPos;
};

void cdecl foo( void* inData)
{
    coord* my_data = (coord*) inData;

    printf("Thread values:\n");
    printf("xVal: %f\n", *(my_data->xPos) );
    printf("yVal: %f\n", *(my_data->yPos) );
}

主体看起来像这样:

{
    double startX = 10;
    double startY = 10;
    /* declare variables to hold the incoming values */
    coord inData;

    inData.xPos = &startX;
    inData.yPos = &startY;

    printf("Initial values:\n");
    printf("xVal: %f\n", *(inData.xPos) );
    printf("yVal: %f\n", *(inData.yPos) );

    _beginthread( foo, 0, (void*) &inData );
}

为什么我的程序显示主线程和线程的值不同,我该如何纠正?

【问题讨论】:

  • 当您的线程运行时,main() 可能已经返回。要么通过值将数据传递给线程,要么确保在线程读取它们时指向的值仍然存在。在这种情况下,HANDLE h=(HANDLE)_beginthread... ; WaitForSingleObject(h); 将确保 main 在线程返回之前不会返回。你也应该用 _endthread() 关闭线程句柄。
  • 你应该使用std::thread

标签: c++ windows multithreading pointers structure


【解决方案1】:

您在堆栈上声明您的结构和双精度值,一旦该方法返回(在_beginthread() 返回之后),堆栈就会被删除,从而导致未定义的行为。

您需要在堆上分配结构,包括double 值。您还需要管理此分配的内存。

另外,我不明白您为什么使用 double * 而不是简单地使用 double

编辑:一些示例代码。这会在堆上分配结构并将分配的数据传递回调用者。线程同步还有一些工作要做,这超出了本题的范围:

struct coord
{
    double xPos;
    double yPos;
};

void cdecl foo(void* inData)
{
    coord* my_data = (coord*) inData;

    printf("Thread values:\n");
    printf("xVal: %f\n", my_data->xPos);
    printf("yVal: %f\n", my_data->yPos);
}

coord *startThread()
{
    coord *inData = new coord;
    inData->xPos = 10;
    inData->yPos = 10;

    _beginthread( foo, 0, (void*) inData );
    return inData;
}

int main()
{
    coord *data = startThread();
    printf("Initial values:\n");
    printf("xVal: %f\n", data->xPos);
    printf("yVal: %f\n", data->yPos);

    // TODO: wait for thread

    return 0;
}

【讨论】:

  • 您能展示一个简短的样本吗?我使用指针是因为线程会在我的真实程序中动态更新坐标以供另一个函数(此处未包含)使用。
【解决方案2】:

改变

coord inData;

static coord inData;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多