我知道我可以用CreateThread()
在程序中创建一个线程,在返回到原来的程序之前,我需要WaitForSingleObject()
来完成它。
我的问题是,原来的程序也是一个线程吗?比方说,我的程序中有一个变量a=3
,然后创建一个线程。从第二个线程,我可以访问变量a
吗?
发布于 2014-03-24 09:59:03
当Windows /S启动进程时,它还将为该进程创建第一个线程。
因此,“原始程序”是错误的名称。但是正在执行progra的初始项是一个线程。
当您的变量范围允许从第二个线程进行访问时,您就无法访问它。如果要传递对特定变量的访问权限,可以使用适当的参数向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);
}
发布于 2014-03-24 10:16:54
这不管用:
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
}
这是一种完全正确的技术,只要您确保堆栈变量的作用域超过线程。
您还可以在具有全局变量或其替代形式(单例类、静态类变量)的线程之间共享内存。
发布于 2014-03-24 09:59:11
是的-线程是操作系统执行的基本单位。没有三分,没有跑动。
https://stackoverflow.com/questions/22617009
复制