有关linux线程资源回收的问题
使用linuxc编程的,开启一个线程,这个线程中申请了一些资源。如果需要这个线程马上取消并且回收申请的资源怎么办啊?
前面使用了pthread_cancel()这个函数,设置了取消点,可是这个也不能立刻就取消回收资源啊啊。。。还有没有其他方法啊?
------解决方案--------------------
如果进程没有结束,这样回收也只是表面上的回收而已!达不到实际回收的效果的
------解决方案--------------------
应使用“线程池”的思想:仅在程序初始化时创建线程,仅在程序结束退出前结束线程,杜绝在程序运行中创建或销毁线程。
参考下面://循环向a函数每次发送200个字节长度(这个是固定的)的buffer,
//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,
//在处理的时候每次从新buffer中取两个字节打印
#ifdefWIN32
#pragmawarning(disable:4996)
#endif
#include
#include
#include
#ifdefWIN32
#include
#include
#include
#defineMYVOIDvoid
#definevsnprintf_vsnprintf
#else
#include
#include
#include
#defineCRITICAL_SECTIONpthread_mutex_t
#defineMYVOIDvoid*
#endif
//Log{
#defineMAXLOGSIZE20000000
#defineMAXLINSIZE16000
#include
#include
#include
charlogfilename1[]="MyLog1.log";
charlogfilename2[]="MyLog2.log";
staticcharlogstr[MAXLINSIZE+1];
chardatestr[16];
chartimestr[16];
charmss[4];
CRITICAL_SECTIONcs_log;
FILE*flog;
#ifdefWIN32
voidLock(CRITICAL_SECTION*l){
EnterCriticalSection(l);
}
voidUnlock(CRITICAL_SECTION*l){
LeaveCriticalSection(l);
}
voidsleep_ms(intms){
Sleep(ms);
}
#else
voidLock(CRITICAL_SECTION*l){
pthread_mutex_lock(l);
}
voidUnlock(CRITICAL_SECTION*l){
pthread_mutex_unlock(l);
}
voidsleep_ms(intms){
usleep(ms*1000);
}
#endif
voidLogV(constchar*pszFmt,va_listargp){
structtm*now;
structtimebtb;
if(NULL==pszFmt
------解决方案--------------------
0==pszFmt[0])return;
vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour,now->tm_min,now->tm_sec);
sprintf(mss,"%03d",tb.millitm);
printf("%s%s.%s%s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if(NULL!=flog){
fprintf(flog,"%s%s.%s%s",datestr,timestr,mss,logstr);
if(ftell(flog)>MAXLOGSIZE){
fclose(flog);
if(rename(logfilename1,logfilename2)){
remove(logfilename2);
rename(logfilename1,logfilename2);
}
}else{
fclose(flog);
}
}
}
voidLog(constchar*pszFmt,...){
va_listargp;
Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
#defineASIZE200
#defineBSIZE240
#defineCSIZE2
charAbuf[ASIZE];
charCbuf[CSIZE];
CRITICAL_SECTIONcs_HEX;
CRITICAL_SECTIONcs_BBB;
structFIFO_BUFFER{
inthead;
inttail;
intsize;
chardata[BSIZE];
}BBB;
intNo_Loop=0;
voidHexDump(intcn,char*buf,intlen){
inti,j,k;
charbinstr[80];