线程参数真实性
Thread param actuality
如何确定线程启动时线程param仍然是实际的?
情况1: my_thread
是创建的,但是param
在创建后立即更改。我们期望my_thread
的param_ptr
指向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);
}
两个点:
- 不要将指针传递给临时变量。
- 如果要防止更改为初始值,请按悬挂启动线程,然后致电
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, ¶m,
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;
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 线程参数真实性