我在使用 Windows 上的多线程 C++ 代码时遇到了一些问题。
class test
{
public:
bool flag;
test() {flag=true;}
void start_do(){while(flag) puts("doing...");}
void stop_do() {flag=0;}
}
int main()
{
test t;
HANDLE h=CreateThread(0,0,(LPTHREAD_START_ROUTINE)t.start_do,0,1,0);
Sleep(5000);
t.stop_do();
return 0;
}
我想用flag改变doing状态。但它不起作用。 谁能帮帮我!
最佳答案
整个代码没有多大意义。
首先,Windows API是一个C api。 C 不知道类或方法是什么。 C 只知道全局函数。所以传递成员函数是第一个错误。
其次,您提供的成员函数看起来不像CreateThread
期望的那样!您应该提供一个带有签名 DWORD __stdcall (void*)
的函数,您的函数看起来根本不像那样。强行施放只会制造更多的麻烦。
第三,传递成员函数的方法是使用语法 &ClassName::functionName
。编写 object.function
没有任何意义。
最后,C++ 有更简单的方法来创建线程,并将它们用作对象,而不是句柄:
test t;
std::thread t([&]{ t.start_do(); });
现在,我不建议使用 winapi 来创建线程,除非你有很好的理由(比如指定堆栈大小,以及堆栈内存是保留还是提交等)
为了这里的讨论,让你的示例工作的方法是将对象“扁平化”为 void*
并将其重新转换回某个全局函数中:
DWORD __stdcall callStartDo(void* pObject){
auto object = reinterpret_cast<test*>(pObject);
if (object){
object->start_do();
}
return 0U;
}
//...
test t;
unsigned long threadID = 0U;
CreateThread(nullptr,0U,&callStartDo,&t,0,&threadID);
再一次,这个例子展示了如何只做它,我强烈建议改用std::thread
。 (看看与 C++ 方式相比涉及多少开销!)
关于c++ - windows C++ 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36033068/