c++ - windows C++ 多线程

标签 c++ windows multithreading

我在使用 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/

相关文章:

c++ - boost multi_polygon 相交不编译

c++ - 从 boost::filesystem 创建目录成功,但是没有创建目录

windows - 跨多个 Windows 平台收集 wifi bssid 和 rssi 数据的最有效方法

python - 没有名为 '_curses' 的模块

c# - 修复跨线程异常

c++ - 构造函数中的临时非常量 istream 引用 (C++)

c++ - 链表输出崩溃

windows - MSysGit - 直接运行bat文件

C#/.NET - 最小并行化快速排序导致性能下降

multithreading - Azure QueueClient MaxConcurrentCalls 不起作用