【问题标题】:Creating a thread创建线程
【发布时间】:2014-03-24 17:56:14
【问题描述】:

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

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

【问题讨论】:

  • 呃...一般来说,创建额外线程的目的是让您的程序可以同时做几件事情,所以创建一个线程然后立即调用WaitForSingleObject 是毫无意义的。

标签: c windows multithreading


【解决方案1】:

当 Windows 操作系统启动一个进程时,它也会为该进程创建第一个线程。

所以,“原始程序”是错误的名称。但是执行程序的初始项是线程。

当您的变量范围允许从第二个线程进行访问时,您就可以访问它。如果您想传递对特定变量的访问权限,可以使用适当的参数 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);
}

【讨论】:

  • 那么如果它在一个高级代码块中,我的线程会找到它吗?它不必是全球性的吗?另外,线程在原始程序的整个持续时间内是唯一的吗?
  • 每个线程都有自己的堆栈用于线程的运行时。这包括所有局部变量,直到离开变量的范围。
  • 你能给我看一个变量超出范围的例子吗?我无法想象在变量之后创建线程时它会超出范围。可以是伪代码。
【解决方案2】:

这行不通:

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

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

编译器将发出一个错误,告诉您a 未在threadProc 中声明。

你可以传递一个指针:

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
}

这是一个完全正确的技术,只要您确保堆栈变量的范围比线程长。

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

【讨论】:

    【解决方案3】:

    是的 - 线程是操作系统的基本执行单元。没有线程,没有运行。

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 1970-01-01
      • 2021-12-18
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多