我对这段代码有以下问题。有人可以帮忙吗?glibc detected ***免费():无效指针
注意:QueueItem正在另一个线程上创建。
WorkItem * Dequeue(Queue ** Q)
{
if(QueueIsEmpty(*Q)) return NULL;
QueueItem * tmp = (*Q)->Head;
(*Q)->Head = ((*Q)->Head)->NextItem;
WorkItem * retval = tmp->workItem;
free(tmp); //Generates glibc detected *** free(): invalid pointer
return retval;
}
编辑当多线程运行时,此功能在访问时受到保护。
WorkItem * DequeueSynchronous(Queue ** Q)
{
WorkItem * retval;
pthread_mutex_lock((*Q)->QueMutex);
retval = Dequeue (Q);
pthread_mutex_unlock((*Q)->QueMutex);
return retval;
}
(* Q) - > Head;分配给我的malloc。
Queue * Queue_Init(pthread_mutex_t * mutex)
{
Queue * retval = (Queue *)malloc(sizeof(Queue *));
retval->Head = retval->Tail =NULL;
retval->QueMutex = mutex;
return retval;
}
void Enqueue (Queue * Q, WorkItem * WI)
{
if(!Q)return;
QueueItem * QI = (QueueItem *) malloc(sizeof(QueueItem *));
QI->workItem = WI;
QI->NextItem = NULL;
if(QueueIsEmpty(Q))
{
Q->Head = Q->Tail = QI;
return;
}
Q->Tail->NextItem = QI;
Q->Tail = QI;
}
void EnqueueSynchronous (Queue * Q, WorkItem * WI)
{
pthread_mutex_lock(Q->QueMutex);
Enqueue (Q, WI);
pthread_mutex_unlock(Q->QueMutex);
}
同样感谢您的意见,我会看看valgrind。
EDIT 2
typedef struct {
char ** FileNames;
int ** Results;
int NumOfItems;
}WorkItem;
typedef struct QI{
WorkItem * workItem;
struct QI * NextItem;
}QueueItem;
typedef struct {
QueueItem * Head, * Tail;
pthread_mutex_t * QueMutex;
}Queue;
出列被称为 - Dequeue(&WorkQue)
调用Dequeue
给予&WorkQue
作为其参数的个数一部分的所有线程;
typedef struct{
int ThreadID;
WorkItem * workItem;
char ** keywordsArray;
int nKeywords;
Queue ** WorkQueue, ** WorkCompletedQ;
}ThreadArgs;
pthread_t threads[NTHREADS];
ThreadArgs threadArgs[NTHREADS];
for(i=0;i<NTHREADS;i++)
{
threadArgs[i].ThreadID=i;
threadArgs[i].workItem = Dequeue(&WorkQue);
threadArgs[i].WorkQueue = &WorkQue;
threadArgs[i].WorkCompletedQ = &WorkCompletedQ;
threadArgs[i].nKeywords=_kwlist->length;
threadArgs[i].keywordsArray = ListToArray(*_kwlist);
}
for(i=0;i<NTHREADS;i++)
{
pthread_create(&threads[i], NULL, WorkerThread,(void *)&(threadArgs[i]));
}
每个线程调用离队使用myWork = DequeueSynchronous(myThreadArgs->WorkQueue);
valgrind +1。 – vanza 2012-04-24 03:13:27
我已经使用了gdb,但会给valgrind一个镜头。双倍免费是不太可能的。 感谢您的输入 – chris 2012-04-24 22:50:22
这个错误没有显示在Valgrind :( – chris 2012-04-25 21:03:00