Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++ 访问冲突读取位置0xfeeefef2多线程编程c++;窗户_C++_Multithreading - Fatal编程技术网

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

C++ 访问冲突读取位置0xfeeefef2多线程编程c++;窗户,c++,multithreading,C++,Multithreading,我有以下代码: -生成一个包含“e”节点的链接列表,每个节点都分配了一个随机值和工作编号 -创建w个线程,如果节点的工作线程号等于其线程id,则每个线程都会在列表中检查,如果是,则根据该值生成sqrt -当列表中的5个或所有值小于2时,主线程将从列表中删除小于2的元素 -一次只能工作3个线程 代码如下: DWORD WINAPI work(LPVOID argument){ int tid = *((int *)argument); elem* p = head; whi

我有以下代码:

-生成一个包含“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
}
DWORD-WINAPI工作(LPVOID参数){
int tid=*((int*)参数);
elem*p=头部;
while(p!=NULL){
如果(tid==p->worker){
WaitForSingleObject(信号量,0L);
双val=p->value;
p->value=sqrt(val);
如果(p->值<2){
EnterCriticalSection(&countMutex);
计数++;
if(count==maxCount){
WakeConditionVariable(&conditionalVar);
}
LeaveCriticalSection(&countMutex);
}       
睡眠(1);
释放信号量(信号量,1L,空);
}
如果(p->next==NULL)
p=水头;
其他的
p=p->next;
}
返回NULL;
}
int _tmain(int argc,_TCHAR*argv[]
{
//生成列表,创建线程(线程被分配给工作函数)
EnterCriticalSection(&countMutex);
而(e>0){
SleepConditionVariableCS(&conditionalVar,&countMutex,INFINITE);
删除元素();
if(e<5)
最大计数=e;
计数=0;

cout您正在遍历没有任何锁的列表

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

如果主线程刚刚删除了
p->next

我相信这意味着您正在访问以前释放的指针。请参阅此处以了解调试器代码的解释:您是舒尔吗,您没有竞争条件?deleteElements是否可能正在处理不受countMutex保护的共享数据。