2014-11-04 40 views
-1

我是C++語言的新手,我在使用pthreads的程序中遇到了指針/內存訪問的麻煩。 這裏是處理:我有一個名爲傳媒類,如下:使用pthreads的C++指針錯誤

class Media 
{ 
    public: 
     int id; 
     int freeSpace = CAPACITY; 
     pthread_mutex_t mutex; 
}; 

和一類名爲文件,如下圖所示:

class File 
{ 
    public: 
     int id; 
     string name; 
     int size; 
     pthread_mutex_t mutex; 
     Media *media; 

    ... 
}; 

這沒有多大意義的問題,但我的程序執行以下操作:我有一個隨機大小隨機文件的矢量,我想用線程將它們放入最小數量的介質中。 問題是我經常發生「雙重免費或腐敗(fasttop)」,「雙免費或腐敗(!prev)」和「分段錯誤」錯誤,並且無法找出原因。我沒有使用malloc,也沒有釋放,但我可能使用了錯誤的方式或類似的東西。 這裏是我的主類的一部分,在線程中使用的方法:

vector<Media> medias; 
vector<File> files; 
vector<File> processedFiles; 

void* processFiles(void* args) 
{ 
    for (int i = 0; i < mediaQuantity; i++) 
    { 
     if (pthread_mutex_trylock(&medias[i].mutex) == 0) 
     { 
      Media* media = &medias[i]; 

      for (int j = (int)files.size() - 1; j >= 0; j--) 
      { 
       if (pthread_mutex_trylock(&files[j].mutex) == 0) 
       { 
        if (files[j].size <= media->freeSpace) 
        { 
         media->freeSpace -= files[j].size; 
         files[j].media = media; 
         processedFiles.push_back(files[j]); 

         files.erase(files.begin() + j); 
        } 

        pthread_mutex_unlock(&files[j].mutex); 
       } 
      } 

      pthread_mutex_unlock(&medias[i].mutex); 
     } 
    } 
} 


int main() 
{ 
    ... 

    Media* media; 

    ... 

    pthread_t threads[threadQuantity]; 

    pthread_barrier_init(&barrier, NULL, threadQuantity); 

    ... 

    for (int i = 1; i <= mediaQuantity; i++) 
    { 
     media = new Media(); 
     media->id = i; 
     medias.push_back(*media); 
    } 

    //Create threads 
    for(unsigned i = 0; i < threadQuantity; i++) 
     pthread_create(&threads[i], NULL, processFiles, NULL); 

    for(unsigned i = 0; i < threadQuantity; i++) 
     pthread_join(threads[i], NULL); 

    ... 
} 

不知怎的,我得到我的運行時間提到的雙重釋放或腐敗和分割錯誤。任何人都可以看到任何錯誤? 對不起,提前感謝大問題!

+0

這是一個調試器的工作,而不是我們的... – 2014-11-04 02:29:10

+0

@πάνταῥεῖ我試過調試,但很難做到這一點當你有線程(或我還不知道如何做到這一點) – 2014-11-04 02:43:58

回答

1

這裏是一個快速瀏覽一下你的代碼,經過提示的那些行:

    processedFiles.push_back(files[j]); 

        files.erase(files.begin() + j); 

是對矯正可以由多個線程simulanuously使用集合。您應該添加鎖以防止兩個線程執行此操作。

+0

謝謝,我會看看那個! – 2014-11-04 02:42:42