我有执行以下操作的代码:
-生成包含“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/