0
我有這樣的代碼,執行以下操作:訪問衝突讀取位置0xfeeefef2多線程編程的C++窗口
-generates包含「e」的節點鏈表,每個節點分配一個隨機值,職工人數
- 創建線程間,列表中的每個線程ckecks如果節點的工人數量等於他的線程ID,如果是這樣,它使開方從價值
- 當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:0000005:訪問衝突讀取位置0xfeeefef2」
我知道這意味着我試圖訪問一個已經被刪除的值,但我不知道爲什麼,因爲列表是同步的。
我相信這意味着您正在訪問您之前釋放的指針。 – drescherjm
看到這裏的調試器代碼的解釋:http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations – drescherjm
你是舒爾,你有沒有比賽條件?是不是有可能deleteElements正在操作不受countMutex保護的共享數據。 – mgr