c++ - 将结构传递给线程

标签 c++ c winapi

我想知道如何将结构传递给线程。我编写了一个示例应用程序,我在 main 中声明了一个结构并尝试将其传递给线程。

这是我的代码:

DWORD WINAPI Name1(LPVOID lparam)
{
    data x;
    x.name[15]="Sarah";
    x.DOB="19/10/2007";
    fputs(stdout,name,15);
    fputs(stdout,DOB,15);

    return 0;
}

int main()
{
    struct data
    {
        char name[15];
        char DOB[15];
    };

    HANDLE thread2;
    DWORD threadID2;
    thread2= CreateThread(NULL,0,Name1,(LPVOID *)data,0,&threadID2);

    if(thread2==NULL)
    {
        cout<<"Couldn't Create Thread:("<<endl;
        exit(0);
    }

    return 0;
}

不幸的是,我没有掌握将结构传递给线程的诀窍 :( 如果有人帮助我,我将不胜感激。

我试图更改结构的数据类型以传递它,但是,我想我不知道该怎么做。

最佳答案

您正在将局部变量传递给线程启动函数。一旦变量超出范围,它将被销毁。这意味着当新线程试图访问它时它可能不存在。您应该为整数类型按值传递或在动态存储(堆)中分配对象。

一旦新线程有了指向对象的指针,它也应该负责销毁它。这完全取决于您希望如何分配和管理对象的所有权。

struct Foo
{
    char name[15];
    char DOB[15];
};

void Start()
{
    Foo *someObject = new Foo();

    CreateThread(NULL, 0, threadFunc, (LPVOID *)someObject, 0, &threadID2);
}

DWORD WINAPI threadFunc(void *v)
{
    Foo *someObject = static_cast<Foo*>(v);

    delete someObject;

    return 0;
}

关于c++ - 将结构传递给线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16165859/

相关文章:

c - 没有正确完成 if 语句

c++ - 是否可以在进程中的所有线程上设置 pthread_sigmask?

c# - 在 C# 中枚举文件句柄

c++ - 我如何找出项目被告知在 Visual Studio 中链接特定库的位置?

c++ - 在 C++ 中测量调用 system() 的执行时间

c++ - 从 boost::adjacency_list 获取边属性(包括相关顶点)

c++ - 如何在没有警告的情况下使用 execv()?

c - 试图了解此 C 程序中静态和动态作用域之间的区别

c++ - 如何检查特定文件夹中是否存在任何文件?

c++ - 使用 Windows API 获取用户的桌面文件夹?