Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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
在C语言中,多线程、多窗口调用一个窗口过程,每次调用是使用新的局部变量还是需要一个互斥体?_C_Windows_Multithreading_User Interface - Fatal编程技术网

在C语言中,多线程、多窗口调用一个窗口过程,每次调用是使用新的局部变量还是需要一个互斥体?

在C语言中,多线程、多窗口调用一个窗口过程,每次调用是使用新的局部变量还是需要一个互斥体?,c,windows,multithreading,user-interface,C,Windows,Multithreading,User Interface,我试图在标题中解释这一切:我有一个多线程C程序,它将有多个窗口调用一个窗口过程 在窗口过程中进行了一些处理。我需要保护它吗,还是每个对窗口过程的调用都要在内存中分开 我的直觉是我不需要互斥,因为它们都是局部变量,这是错的吗 LRESULT APIENTRY EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_GETDLGCODE) return

我试图在标题中解释这一切:我有一个多线程C程序,它将有多个窗口调用一个窗口过程

在窗口过程中进行了一些处理。我需要保护它吗,还是每个对窗口过程的调用都要在内存中分开

我的直觉是我不需要互斥,因为它们都是局部变量,这是错的吗

LRESULT APIENTRY EditSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{   
    if (uMsg == WM_GETDLGCODE) 
        return DLGC_WANTALLKEYS;
    else if(uMsg == WM_CHAR)
    {
        if( (int) wParam == 13)
        {
            char* strCurrentCommand;

            unsigned long ulThisConversation = GetConversation(0, 0, hwnd, 0, 0);
            ...

我关心的是局部变量strCurrentCommand和ulThisConversation。

您不需要使用互斥来保护堆栈变量。

函数的局部变量和参数位于堆栈上。每个线程都有自己的堆栈,函数的每次调用都会在它运行的线程堆栈上为其参数和局部变量获取一个空间。这样就可以了。

无需保护局部变量,因为每次调用window proc函数都会在堆栈上分配新的副本


但请记住,为了避免使用互斥锁或其他同步机制,您还需要确保从window proc函数内部调用的任何函数(如
GetConversation
和此函数调用的任何函数)都是线程安全的。

局部变量位于堆栈上。每个线程都有自己的堆栈空间。谢谢您的回答。在函数线程安全的情况下,除了确保没有同步的全局可访问内存的修改外,还有什么可考虑的吗?线程安全涉及的不仅仅是不访问全局内存,而是任何类型的资源,如文件、子进程等。