【问题标题】:How to send a string to _beginthreadex for the thread to read it?如何将字符串发送到 _beginthreadex 以供线程读取?
【发布时间】:2020-01-08 14:07:00
【问题描述】:

我想使用 _beginthreadex 并传递一个字符串,即域的名称。通过它的正确方法/最佳实践是什么?

  1. 通过变量本身(sDomain)?
    WCHAR sDomain[256] = {0};
    //...copy domain into sDomain
    UINT threadID = 0;
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_SaveDomainName, sDomain, 0, &threadID);
  1. 还是通过变量的地址 (&sDomain)?
    WCHAR sDomain[256] = {0};
    //...copy domain into sDomain
    UINT threadID = 0;
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_SaveDomainName, &sDomain, 0, &threadID);
  1. 还是我做一个结构体并传递结构体元素(&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


【解决方案1】:

下面是最简单的代码实现,当然可以自定义一些类型来传递,因为线程函数的参数类型是void,可以任意转换

#include <iostream>
using namespace std;

UINT Thread_SaveDomainName(LPVOID params)
{
    char* szDomain = (char*)params;
    cout<<szDomain<<endl;
    
    return 0;
}

int main()
{
    char* szDomain = "8080";
    UINT threadID = -1;
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_SaveDomainName, (void*)szDomain, 0, &threadID);
    
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多