线程参数现实

时间:2014-01-24 08:09:10

标签: c++ multithreading winapi

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

情况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, &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);
}

2 个答案:

答案 0 :(得分:2)

两点:

  1. 不要将指针传递给临时变量。
  2. 如果您想阻止更改为初始值,请将该线程启动为暂停,然后再调用ResumeThread
  3. 请注意,尽管可以传递给线程函数的参数被声明为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, &param, 
                                      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;