【发布时间】:2014-11-04 02:26:51
【问题描述】:
我是 C++ 语言的新手,在使用 pthread 的程序中访问指针/内存时遇到了一些问题。 这是交易:我有一个名为 Media 的类,如下所示:
class Media
{
public:
int id;
int freeSpace = CAPACITY;
pthread_mutex_t mutex;
};
还有一个名为File的类,如下:
class File
{
public:
int id;
string name;
int size;
pthread_mutex_t mutex;
Media *media;
...
};
这对问题来说并不重要,但我的程序执行以下操作:我有一个带有一些随机大小的随机文件的向量,我想使用线程将它们放入最少数量的媒体中。 问题是我不断收到“双重释放或损坏(fasttop)”、“双重释放或损坏(!prev)”和“分段错误”错误,但无法找出原因。我没有使用 malloc 或 frees,但我可能以错误的方式或类似的方式使用指针。 这是我的主类的一部分,以及线程中使用的方法:
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);
...
}
不知何故,我遇到了我在运行时提到的双重释放或损坏和分段错误。有人能看出什么不对吗? 很抱歉这个大问题,提前感谢!
【问题讨论】:
-
这是调试器的工作,不是我们的......
-
@πάνταῥεῖ 我尝试过调试,但是当你有线程时很难做到(或者我还不知道如何正确地做到这一点)
标签: c++ pointers segmentation-fault pthreads