如何在线程启动时确定线程参数仍然是实际的?
情况1: my_thread
已创建,但param
在创建后立即更改。我们希望my_thread
param_ptr
的{{1}}指向56
,但现在它会89
。
DWORD WINAPI my_thread(LPVOID param_ptr);
int param = 56;
CreateThread(NULL, NULL, my_thread, ¶m, NULL, NULL);
param = 89;
情况2: my_thread
已创建,但由于param
已关闭,create_my_thread
不再存在。
DWORD WINAPI my_thread(LPVOID param_ptr);
void create_my_thread(int param)
{
CreateThread(NULL, NULL, my_thread, ¶m, NULL, NULL);
}
答案 0 :(得分:2)
两点:
ResumeThread
。请注意,尽管可以传递给线程函数的参数被声明为VOID
指针,但它实际上不必是指针。所以,如果你只想传递一些数字(如你的例子中所示),你可以直接投射它:
CreateThread(NULL, NULL, my_thread, (LPVOID)56, NULL, NULL);
然后在线程函数中,执行相反的操作:
DWORD WINAPI my_thread(LPVOID param_ptr)
{
DWORD dwNumber = (DWORD)param_ptr;
// dwNumber is now equal to 56
}
有关暂停和恢复的信息,请参阅CreateThread options and use
CREATE_SUSPENDED` MSDN,例如:
// create thread but don't start it
HANDLE hThread = CreateThread(NULL, NULL, my_thread, ¶m,
CREATE_SUSPENDED, NULL);
// ... make any changes to `param` thst you need your thread to be aware of ...
// start the thread
ResumeThread(hThread);
答案 1 :(得分:1)
通过堆传递变量并在线程中删除。如果API允许,智能指针可以提供帮助,否则只是习惯允许删除线程函数中的参数。
DWORD WINAPI my_thread(LPVOID param_ptr);
int* param = new(56);
CreateThread(NULL, NULL, my_thread, param, NULL, NULL);
int newParam = 89;