我是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);
...
}
不知怎的,我得到我的運行時間提到的雙重釋放或腐敗和分割錯誤。任何人都可以看到任何錯誤? 對不起,提前感謝大問題!
這是一個調試器的工作,而不是我們的... – 2014-11-04 02:29:10
@πάνταῥεῖ我試過調試,但很難做到這一點當你有線程(或我還不知道如何做到這一點) – 2014-11-04 02:43:58