【问题标题】:CreateThread sharing variables to external functionsCreateThread 将变量共享给外部函数
【发布时间】:2019-10-03 06:37:16
【问题描述】:

总结问题: 在线程外部的函数中监视线程变量的最佳方法是什么?

原问题: 我希望更好地了解使用 Windows 线程时的最佳实践。我知道有更现代的线程方法,但我仅限于使用 CreateThread。当前设置在 CreateThread 调用的函数中包含一个 WaitForSingleObject 函数,该函数更新一些指针。我需要在线程外部访问这些指针。访问内部数据的最佳实践是什么 WaitForSingleObject 函数?使用 LPVOID params 参数将参数传递给函数很简单,但除了线程 ID 和使用全局变量之外似乎没有输出选项。

HANDLE WINAPI CreateThread( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in_opt LPVOID lpParameter, __in DWORD dwCreationFlags, __out_opt LPDWORD lpThreadId ); 

【问题讨论】:

  • 请出示您的代码。
  • @selbie 在这种情况下我不能,因为它是为了工作。如果需要,我可以编写一些模拟代码,但我只是在寻找一般建议
  • 我当然可以提供帮助,但是您的问题非常漫无边际。而且我更容易根据您已经提供的编码示例给出答案。
  • 您可以将指向结构或类对象的指针作为LPVOID 参数传递,并使用该结构/类的数据成员代替全局变量。
  • 不确定access data within the WaitForSingleObject function 是什么意思。您的意思是如何访问您作为 LPTHREAD_START_ROUTINE 传递的例程中的数据?此外,还不清楚您对输出的期望是什么。你想达到什么目的?工作线程是否异步执行一些短任务?它是否在不断地工作并且你想观察变化?如何共享数据的最佳做法将相应改变。

标签: c++ windows multithreading createthread


【解决方案1】:

感谢阿德里安的建议。将指针传递给结构有效。工作代码的简化版本如下。

#include <Windows.h>
#include <iostream>

struct MyStruct {
    int var;
};

DWORD WINAPI mythread(LPVOID lpParameter)
{
    MyStruct *PSTRUCT = (MyStruct*)lpParameter;
    PSTRUCT->var = 22;
    std::cout << "Thread function value: " << PSTRUCT->var << std::endl;
    return 0;
}

int main(int argc, char* argv[])
{
    MyStruct *PSTRUCT;
    HANDLE myhandle;
    DWORD mythreadid;

    PSTRUCT = reinterpret_cast<MyStruct*>(HeapAlloc(GetProcessHeap(), 0, sizeof(MyStruct)));
    PSTRUCT->var = 0;
    myhandle = CreateThread(0, 0, mythread, (LPVOID)PSTRUCT, 0, &mythreadid);
    WaitForSingleObject(myhandle, INFINITE);
    std::cout << "Main function value: " << PSTRUCT->var << std::endl;
    getchar();
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多