我知道我可以使用CreateThread()
在程序中创建一个线程,我需要WaitForSingleObject()
才能在返回原始程序之前完成它。
我的问题是,原始程序是一个线程吗?
说,我的程序中有一个变量a=3
,然后我创建一个线程。从第二个主题,我可以访问我的变量a
吗?
答案 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);
}
编译器会发出错误消息,告诉您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
}
这是一种非常正确的技术,只要你确保堆栈变量的范围超过线程。
您还可以在具有全局变量或其替代形式(单例类,静态类变量)的线程之间共享内存。
答案 2 :(得分:0)
是 - 线程是操作系统的基本执行单元。没有穿线器,没有跑步者。