1

我想知道如何将结构传递给线程。我编写了一个示例应用程序,在其中声明了一个结构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;
}

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

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

4

2 回答 2

5

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

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

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;
}
于 2013-04-23T09:40:42.603 回答
2

如果要将结构传递给线程,则必须在堆上而不是在堆栈上获取该结构,并将其地址传递给线程。我还修复了一些错误......比如字符串复制,等等......

我没有使用任何 typedef,因为您似乎使用的是 C++。

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

DWORD WINAPI Name1(LPVOID lparam)
{
    data *x = (data*)lparam;
    strcpy(x->name, "Sarah");
    strcpy(x->DOB, "19/10/2007");
    fputs(stdout, x->name, 15);
    fputs(stdout, x->DOB, 15);

    HeapFree(GetProcessHeap(), 0, x);

    return 0;
}

int main()
{
    HANDLE thread2;
    DWORD threadID2;
    data * x;

    x = HeapAlloc(GetProcessHeap(), 0, sizeof(data));
    thread2= CreateThread(NULL, 0, Name1, (LPVOID)x, 0, &threadID2);
    if(thread2==NULL)
    {
        cout << "Couldn't Create Thread:(" << endl;
        exit(0);
    }

    return 0;
}
于 2013-04-23T09:41:30.570 回答