【发布时间】:2020-01-08 14:07:00
【问题描述】:
我想使用 _beginthreadex 并传递一个字符串,即域的名称。通过它的正确方法/最佳实践是什么?
- 通过变量本身(sDomain)?
WCHAR sDomain[256] = {0};
//...copy domain into sDomain
UINT threadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_SaveDomainName, sDomain, 0, &threadID);
- 还是通过变量的地址 (&sDomain)?
WCHAR sDomain[256] = {0};
//...copy domain into sDomain
UINT threadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_SaveDomainName, &sDomain, 0, &threadID);
- 还是我做一个结构体并传递结构体元素(&sDomain[0])?
struct strDomain {TCHAR sDomain[256];};
strDomain *sDomain = new strDomain[1]();
//...copy domain into strDomain[0].sDomain
UINT threadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_SaveDomainName, &sDomain[0], 0, &threadID);
【问题讨论】:
-
以上都不是。 sDomain 是函数的局部变量,函数完成后消失。通常在线程开始运行之前,它会不可避免地读取随机垃圾。一种基本方法是在堆上分配它(new[] 或 malloc)并在线程中释放它。或者您需要联锁,阻止线程函数发出信号的事件。
-
好收获。假设我在继续函数之前等待线程退出所以它不会消失,这是将域名传递给线程的正确方法?
-
如果你等它退出,那么使用线程根本没有意义,你还不如直接调用线程函数。
-
你为什么不用
std::thread? -
所以,假设你不想像@HansPassant所说的那样使用简单的函数,并且因为sDomain是一个数组,你可以直接传递
sDomain。它是第一个元素数组内存地址。
标签: multithreading visual-c++ beginthreadex