簡體   English   中英

x86上的QueueUserAPC訪問沖突

[英]QueueUserAPC access violation on x86

我正在嘗試使用QueueUserAPC在特定線程上異步運行某些功能。 當針對x64進行編譯時,我的代碼可以正常工作,但是針對x86進行編譯和運行時,出現訪問沖突。

在我的文章結尾處,有一個最小的完整示例,顯示了我要執行的操作(為簡潔起見,省略了線程和事件的清理)。

在我的機器上,當我為“ x64”編譯並運行時,我得到了預期的輸出:

等候...

異步功能!

等候...

異步功能!

等候...

ConsoleApplication3.exe(進程17100)以代碼0退出。

當我為“ x86”編譯並運行時,我得到:

等候...

異步功能!

然后是訪問沖突,在這里:

if (WaitForSingleObjectEx(param, INFINITE, TRUE) == WAIT_OBJECT_0)

在ConsoleApplication3.exe中的0x776227FB(ntdll.dll)處引發異常:0xC0000005:訪問沖突讀取位置0x36623194。

我究竟做錯了什么?

完整示例:

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <conio.h>

DWORD ThreadFunction(LPVOID param)
{
    while (true)
    {
        printf("waiting...\n");

        if (WaitForSingleObjectEx(param, INFINITE, TRUE) == WAIT_OBJECT_0)
            break;
    }

    ExitThread(0);
    return 0;
}

void AsyncFunction(UINT_PTR param)
{
    printf("async function!\n");
}

int main()
{
    HANDLE hThread, hStopEvent;
    DWORD threadID;

    hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunction, hStopEvent, 0, &threadID);

    Sleep(1000);

    QueueUserAPC((PAPCFUNC) AsyncFunction, hThread, NULL);

    Sleep(1000);

    QueueUserAPC((PAPCFUNC) AsyncFunction, hThread, NULL);

    Sleep(1000);

    SetEvent(hStopEvent);

    WaitForSingleObject(hThread, INFINITE);
}

我的AsyncFunction定義有兩個錯誤:

1-參數類型應為ULONG_PTR而不是 UINT_PTR 這實際上是我實際實施中的復制粘貼錯誤

2-函數缺少調用約定

void AsyncFunction(UINT_PTR param)應該為void CALLBACK AsyncFunction(ULONG_PTR param)

然后,無需在此處PAPCFUNCPAPCFUNC

QueueUserAPC((PAPCFUNC) AsyncFunction, hThread, NULL);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM