创建一个线程

时间:2014-03-24 17:56:15

标签: c windows multithreading

我知道我可以使用CreateThread()在程序中创建一个线程,我需要WaitForSingleObject()才能在返回原始程序之前完成它。

我的问题是,原始程序是一个线程吗? 说,我的程序中有一个变量a=3,然后我创建一个线程。从第二个主题,我可以访问我的变量a吗?

3 个答案:

答案 0 :(得分:1)

当Windows O / S启动进程时,它还将为该进程创建第一个线程。

所以,"原创节目"是错的名字。但正在执行程序的初始项是一个线程。

当您的变量范围允许从第二个线程访问时,您可以访问它。如果要传递对特定变量的访问权限,可以使用CreateThread的相应参数传递指向它的指针。但要注意:当原始线程的执行超出此变量的范围时,指针将变为无效。我建议考虑重新设计。

修改的 根据要求,这是变量超出范围的示例。 这将是一个错误的实现:

DWORD TheThread(void*p)
{
    int *pcounter = (int*)p;
    // do anything with pcounter
}

HANDLE MakeItRun()
{
    int counter;
    return CreateThread(0, 0, &TheThread, &counter, 0, 0);
} // scope of counter ends here

int main()
{
    HANDLE h;
    h = MakeItRun();
    WaitForSingleObject(h, INFINITE);
}

答案 1 :(得分:1)

这不起作用:

DWORD WINAPI threadProc(LPVOID param)
{
    a = 5;
}

int main()
{
    int a = 3;
    HANDLE thread = CreateThread(NULL, 0, threadProc, NULL, 0, NULL);
    WaitForSingleObject(thread, INFINITE);
}

编译器会发出错误消息,告诉您athreadProc未声明。

您可以通过指针传递:

DWORD WINAPI threadProc(LPVOID param)
{
    int *aPtr = (int *)param;
    *aPtr = 5;
}

int main()
{
    int a = 3;
    HANDLE thread = CreateThread(NULL, 0, threadProc, &a, 0, NULL);
    WaitForSingleObject(thread, INFINITE);
    // value of a is now 5
}

这是一种非常正确的技术,只要你确保堆栈变量的范围超过线程。

您还可以在具有全局变量或其替代形式(单例类,静态类变量)的线程之间共享内存。

答案 2 :(得分:0)

是 - 线程是操作系统的基本执行单元。没有穿线器,没有跑步者。