【问题标题】:How to pass in the 'this' pointer to a C++ WinAPI thread?如何将“this”指针传递给 C++ WinAPI 线程?
【发布时间】:2020-06-09 16:15:39
【问题描述】:

我正在尝试运行 C++ 线程,但也将实例传递给类本身。我似乎无法弄清楚。

我有一个线程参数结构:

struct CLASS_PARAMS {
    SomeClass* ptr;
};

然后我调用我的设置方法:

void SomeClass::setup() {
    CLASS_PARAMS params;
    params.ptr = this;
    CreateThread(NULL, 0, SetupThread, &params, 0, NULL);
}

SomeClass::setup()上方,我定义SetupThread

DWORD WINAPI SetupThread(LPVOID lpParam) {
    CLASS_PARAMS* params = (CLASS_PARAMS *) lpParam;
    SomeClass* inst = params->ptr;
    ....
    ....
}

但是,我在使用 inst 时遇到了读取访问冲突。我在SomeClass 中还有其他方法需要通过线程访问:

inst->getSomeValue();
...
inst->setSomeValue(someValue);
...

但它不允许我这样做。关于我做错了什么有什么建议吗?

【问题讨论】:

  • 竞争条件:params 变量在线程开始执行时已不存在。
  • 您不需要所有 C 级黑客。 std::thread 是为 C++ 设计的;改用它。

标签: c++ windows multithreading


【解决方案1】:

你在堆栈上分配CLASS_PARAMS,所以它在使用前被销毁。

动态分配它,传递指针并在线程中释放它。

或者,如果您只需要传递this,则传递它而不使用包装结构,只需转换为LPVOID并返回(但请务必使用相同的类指针类型以避免指针调整错误)

【讨论】:

  • 谢谢先生。将this 转换为LPVOID 并返回完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多