2013-01-08 27 views
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」

我知道這意味着我試圖訪問一個已經被刪除的值,但我不知道爲什麼,因爲列表是同步的。

+0

我相信這意味着您正在訪問您之前釋放的指針。 – drescherjm

+0

看到這裏的調試器代碼的解釋:http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations – drescherjm

+0

你是舒爾,你有沒有比賽條件?是不是有可能deleteElements正在操作不受countMutex保護的共享數據。 – mgr

回答

2

您正在遍歷列表而沒有任何鎖定。

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

如果主線程剛刪除了怎麼辦p->next