线程参数真实性

Thread param actuality

本文关键字:真实性 参数 线程      更新时间:2023-10-16

如何确定线程启动时线程param仍然是实际的?

情况1: my_thread是创建的,但是param在创建后立即更改。我们期望my_threadparam_ptr指向56,但现在它确实对89

DWORD WINAPI my_thread(LPVOID param_ptr);
int param = 56;
CreateThread(NULL, NULL, my_thread, &param, 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, &param, NULL, NULL);
}

两个点:

  1. 不要将指针传递给临时变量。
  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
}

暂停和恢复,请参阅MSDN的CreateThread options and use Create_suspended`,例如:

// create thread but don't start it
HANDLE hThread = CreateThread(NULL, NULL, my_thread, &param, 
                                  CREATE_SUSPENDED, NULL);
// ... make any changes to `param` thst you need your thread to be aware of ...
// start the thread
ResumeThread(hThread);

通过堆传递变量并在线程中删除。智能指针可以在API允许的情况下提供帮助,否则只需习惯于允许删除线程函数中的参数。

DWORD WINAPI my_thread(LPVOID param_ptr);
int* param = new(56);
CreateThread(NULL, NULL, my_thread, param, NULL, NULL);
int newParam = 89;