c++ - 访问冲突读取位置0xfeeeefef2 多线程编程c++ windows

标签 c++ multithreading

我有执行以下操作的代码:

-生成包含“e”个节点的链表,每个节点都分配了一个随机值,以及worker编号

-创建w个线程,如果节点的worker编号等于他的线程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 中 0x00fe1c8e 处的未处理异常:0xC0000005:读取位置 0xfeeeef2 的访问冲突。”

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

最佳答案

您正在无锁地遍历列表。

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

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

关于c++ - 访问冲突读取位置0xfeeeefef2 多线程编程c++ windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217762/

相关文章:

c++ - 从 Eigen::CwiseBinaryOp 转换为 MatrixXd 导致段错误

c# - BlockingCollection 在 10 秒内不会重试

c++ - 如何循环 multimap 以获得每个键的第一个键值对?

c++ - rapidjson pretty print 使用 JSON 字符串作为编写器的输入

multithreading - 将托管 .NET 客户端设置为使用 STA 线程是否有任何原因会导致 native COM 服务器中出现异常问题?

c# - 使用线程时是否需要锁定 "read only"服务?

Java 关闭 Hook 未运行

c - 如果我分离一个已经加入的线程会发生什么?

c++ - 使用 FreeImage 加载 RAW 灰度图像

c++ - 使用模板(而不是继承)对类中的类型进行规范