900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux 线程退出资源回收 有关linux线程资源回收的有关问题

linux 线程退出资源回收 有关linux线程资源回收的有关问题

时间:2020-02-22 20:16:13

相关推荐

linux 线程退出资源回收 有关linux线程资源回收的有关问题

有关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];

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。