访问冲突读取位置0xfeeefef2多线程编程c++窗口

Access violation reading location 0xfeeefef2 multithreaded programming c++ windows

本文关键字:编程 c++ 窗口 多线程 0xfeeefef2 读取 位置 访问冲突      更新时间:2023-10-16

我有以下代码:

-生成一个包含"e"个节点的链表,每个节点分配了一个随机值,以及工作编号

-创建w个线程,每个线程在列表中检查节点的工作编号是否等于其线程id,如果是,则从值

进行SQRT。

——当列表中的5或所有值都小于2时,主线程从列表中删除小于2的元素

-一次只能运行3个线程。

代码如下:

DWORD WINAPI work(LPVOID argument){
    int tid = *((int *)argument);
    elem* p = head;
    while(p!=NULL){
        if (tid == p->worker){
            WaitForSingleObject(semaphor, 0L);
            double val = p->value;
            p->value = sqrt(val);
            if (p->value < 2){
                EnterCriticalSection(&countMutex);
                count++;
                if(count == maxCount){
                    WakeConditionVariable (&conditionalVar);
                }
                LeaveCriticalSection(&countMutex);
            }       
            Sleep(1);
            ReleaseSemaphore(semaphor, 1L, NULL);
        }
        if (p->next == NULL)
            p = head;
        else 
            p = p->next;
    }
    return NULL;
}
int _tmain(int argc, _TCHAR* argv[])
{
    //generate list, create threads (the threads are assigned to the work function)
    EnterCriticalSection(&countMutex);
    while(e > 0){
        SleepConditionVariableCS(&conditionalVar, &countMutex, INFINITE);
        deleteElements();
        if (e < 5)
            maxCount = e;
        count = 0;
        cout << "After erasure: n";
        printList();
        cout << "n";
    }
    LeaveCriticalSection(&countMutex);

    //free space
}

问题是,在第一次删除后,我得到错误"在mainW.cpp.exe: 0xC0000005中0x00fe1c8e未处理异常:访问违规读取位置0xfeeefef2。"

我意识到这意味着在某个地方我试图访问一个已经被删除的值,但我不知道为什么,因为列表是同步的。

在没有任何锁的情况下遍历列表

if (p->next == NULL)
    p = head;
else 
    p = p->next;

如果主线程刚刚删除了p->next怎么办?