Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading WinAPI-需要CreateThread();s线程函数发送附加参数_Multithreading_Winapi - Fatal编程技术网

Multithreading WinAPI-需要CreateThread();s线程函数发送附加参数

Multithreading WinAPI-需要CreateThread();s线程函数发送附加参数,multithreading,winapi,Multithreading,Winapi,在我的例子中,我需要CreateThread()函数的线程函数processClient(LPVOID)在创建线程时接受其他参数(即:processClient(LPVOID,someADTorARRAY)) 我当前的代码: ...function declaration DWORD WINAPI processClient(LPVOID lpParam){ ...do stuff with socket } ...in main CreateThread(

在我的例子中,我需要CreateThread()函数的线程函数processClient(LPVOID)在创建线程时接受其他参数(即:processClient(LPVOID,someADTorARRAY))

我当前的代码:

...function declaration
DWORD WINAPI processClient(LPVOID lpParam){
    ...do stuff with socket
}

...in main
CreateThread(
                NULL,                       // don't inherit handle
                0,                          // use default size for the executable
                processClient,
                (LPVOID)ClientSocket,       // thread data
                0,                          // run right away
                &i );

创建一个包含所有参数的结构,然后将指针传递给该结构

struct ClientParams
{
    socket sock;
    someADT adt;
    ...
}

ClientParams params = new ClientParams();
CreateThread(..., (LPVOID)params, ...);

创建一个包含所有参数的结构,然后将指针传递给该结构

struct ClientParams
{
    socket sock;
    someADT adt;
    ...
}

ClientParams params = new ClientParams();
CreateThread(..., (LPVOID)params, ...);

不相关,但请特别注意“调用C运行时库(CRT)的可执行文件中的线程应使用_beginthreadex和_endthreadex函数进行线程管理,而不是使用CreateThread和ExitThread”的备注部分。并且应该真正读取must。@IInspectable:must,如果它使用某些函数。然而,尽管如此,许多这样的函数(例如,
strtok
)还是最好避免使用。唯一真正的问题是,关于哪些函数要避免的唯一文档是
\u beginthread[ex]
@Jerry的源代码
errno
,或者语言环境呢?它们都是每个线程控制的。我假设可以从未正确初始化的线程安全调用的CRT函数列表比不能正确初始化的函数列表要短得多。从技术上讲,你是对的。你暗示的建议是错误的。@IInspectable:我没有建议任何事情。我只是在评论(因此在评论中的位置)。“安全”列表实际上比你想象的要长得多。如果您想了解详细信息,crt源代码中的
tidtable.c
是一个合理的起点,但请特别注意“可执行文件中调用c运行时库(crt)的线程”的备注部分应使用_beginthreadex和_endthreadex函数进行线程管理,而不是使用CreateThread和ExitThread”。并且应该真正读取must。@IInspectable:must,如果它使用某些函数。然而,尽管如此,许多这样的函数(例如,
strtok
)还是最好避免使用。唯一真正的问题是,关于哪些函数要避免的唯一文档是
\u beginthread[ex]
@Jerry的源代码
errno
,或者语言环境呢?它们都是每个线程控制的。我假设可以从未正确初始化的线程安全调用的CRT函数列表比不能正确初始化的函数列表要短得多。从技术上讲,你是对的。你暗示的建议是错误的。@IInspectable:我没有建议任何事情。我只是在评论(因此在评论中的位置)。“安全”列表实际上比你想象的要长得多。如果您想深入了解细节,crt源代码中的
tidtable.c
是一个合理的起点,严格来说不是。如果将对象设为本地对象并将其传递给线程函数,则调用函数可能会返回,导致对象超出范围,并导致指针在另一个线程中访问时无效。@shawna,如果主线程将等待子线程退出,则它可以传递本地/堆栈对象。否则,最好是分配内存,让子线程释放它。严格来说,不是这样的。如果将对象设为本地对象并将其传递给线程函数,则调用函数可能会返回,导致对象超出范围,并导致指针在另一个线程中访问时无效。@shawna,如果主线程将等待子线程退出,则它可以传递本地/堆栈对象。否则,最好分配内存,并让子线程释放它。