内存泄漏-pthread_create属性设置不当导致的

博客指出因pthread_create属性设置不当,引发了泄漏问题,但未给出具体内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

``` Task stTaskQueue[256]; int iTaskCount = 0; pthread_mutex_t stMutexQueue; pthread_cond_t stCondQueue; void* PthreadPoolWorker(void* arg) { Task* pstTask; while(g_iExit == 0) { pthread_mutex_lock(&stMutexQueue); while(iTaskCount == 0) { pthread_cond_wait(&stCondQueue, &stMutexQueue); } pstTask = &stTaskQueue[--iTaskCount]; pthread_mutex_unlock(&stMutexQueue); pstTask->task(pstTask->arg); } } int ThreadPoolSubmit(void* (*task)(void*),void* arg) { int iRet = -1; if(pthread_mutex_lock(&stMutexQueue) != 0) { cmn_PrtError("Error in locking mutex"); } if(iTaskCount > 255) { pthread_mutex_unlock(&stMutexQueue); cmn_PrtError("Error in queue overflow"); } stTaskQueue[iTaskCount].task = task; stTaskQueue[iTaskCount].arg = arg; iTaskCount++; if(pthread_mutex_unlock(&stMutexQueue) != 0) { cmn_PrtError("Error in unlocking mutex"); } if(pthread_cond_signal(&stCondQueue) < 0) { cmn_PrtError("Error in signaling condition"); } iRet = 0; _Exit: return iRet; } int ThreadPoolInit(void) { int iRet = -1; if(pthread_mutex_init(&stMutexQueue, NULL) <0) { cmn_PrtError("Error in initializing mutex"); } if(pthread_cond_init(&stCondQueue, NULL)) { cmn_PrtError("Error in initializing condition"); } for(int i = 0; i < 5; i++) { pthread_t stThread; pthread_create(&stThread, NULL, PthreadPoolWorker, NULL); pthread_detach(stThread); } iRet = 0; _Exit: return iRet; }```int ThreadPoolDestroy(void) { int iRet = -1; g_iExit = 1; if(pthread_mutex_lock(&stMutexQueue)!= 0) { cmn_PrtError("Error in locking mutex"); } while(iTaskCount > 0) { pthread_cond_wait(&stCondQueue, &stMutexQueue); } if(pthread_mutex_unlock(&stMutexQueue)!= 0) { cmn_PrtError("Error in unlocking mutex"); } if(pthread_cond_broadcast(&stCondQueue) < 0) { cmn_PrtError("Error in broadcasting condition"); } if(pthread_mutex_destroy(&stMutexQueue)!= 0) { cmn_PrtError("Error in destroying mutex"); } if(pthread_cond_destroy(&stCondQueue)!= 0) { cmn_PrtError("Error in destroying condition"); } iRet = 0; _Exit: return iRet; } 检查代码是否有bug,并给出解决方案
03-13
``` Task stTaskQueue[256]; int iTaskCount = 0; pthread_mutex_t stMutexQueue; pthread_cond_t stCondQueue; pthread_t stThreadAry[cmnDfn_WORKING_PTHREAD_NUMBER]; void* PthreadPoolWorker(void* arg) { Task* pstTask; g_iExit = 0; while(g_iExit == 0) { if(pthread_mutex_lock(&stMutexQueue)) { cmn_PrtError("Error in locking mutex"); } while(iTaskCount == 0) { pthread_cond_wait(&stCondQueue, &stMutexQueue); } pstTask = &stTaskQueue[--iTaskCount]; if(pthread_mutex_unlock(&stMutexQueue)) { cmn_PrtError("Error in unlocking mutex"); } pstTask->task(pstTask->arg); } _Exit: pthread_exit(NULL); } int ThreadPoolSubmit(void* (*task)(void*),void* arg) { int iRet = -1; if(pthread_mutex_lock(&stMutexQueue) != 0) { cmn_PrtError("Error in locking mutex"); } if(iTaskCount > 255) { pthread_mutex_unlock(&stMutexQueue); cmn_PrtError("Error in queue overflow"); } stTaskQueue[iTaskCount].task = task; stTaskQueue[iTaskCount].arg = arg; iTaskCount++; if(pthread_mutex_unlock(&stMutexQueue) != 0) { cmn_PrtError("Error in unlocking mutex"); } if(pthread_cond_signal(&stCondQueue) < 0) { cmn_PrtError("Error in signaling condition"); } iRet = 0; _Exit: return iRet; } int ThreadPoolInit(void) { int iRet = -1; int iLoopNum; if(pthread_mutex_init(&stMutexQueue, NULL) <0) { cmn_PrtError("Error in initializing mutex"); } if(pthread_cond_init(&stCondQueue, NULL)) { cmn_PrtError("Error in initializing condition"); } for(iLoopNum = 0; iLoopNum < 5; iLoopNum++) { pthread_create(&stThreadAry[iLoopNum], NULL, PthreadPoolWorker, NULL); } iRet = 0; _Exit: return iRet; } int ThreadPoolDestroy(void) { int iRet = -1; g_iExit = 1; int iLoopNum; if(pthread_mutex_lock(&stMutexQueue)!= 0) { cmn_PrtError("Error in locking mutex"); } while(iTaskCount > 0) { pthread_cond_wait(&stCondQueue, &stMutexQueue); } if(pthread_mutex_unlock(&stMutexQueue)!= 0) { cmn_PrtError("Error in unlocking mutex"); } if(pthread_cond_broadcast(&stCondQueue) < 0) { cmn_PrtError("Error in broadcasting condition"); } for(iLoopNum = 0; iLoopNum < cmnDfn_WORKING_PTHREAD_NUMBER; iLoopNum++) { if(pthread_join(stThreadAry[iLoopNum], NULL)) { cmn_PrtError("Error in joining thread"); } } if(pthread_mutex_destroy(&stMutexQueue)!= 0) { cmn_PrtError("Error in destroying mutex"); } if(pthread_cond_destroy(&stCondQueue)!= 0) { cmn_PrtError("Error in destroying condition"); } iRet = 0; _Exit: return iRet; }```检查代码是否有bug并给出解决方案
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值