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

本文探讨了如何在Linux C编程中高效回收线程申请的资源,包括使用pthread_cancel和线程池策略。作者分享了避免资源泄漏的技巧,并通过实例演示了如何结合取消点与线程池来确保资源在需要时能立即释放。
摘要由CSDN通过智能技术生成

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

使用linux c编程的,开启一个线程,这个线程中申请了一些资源。如果需要这个线程马上取消并且回收申请的资源怎么办啊?

前面使用了pthread_cancel()这个函数,设置了取消点,可是这个也不能立刻就取消回收资源啊啊。。。还有没有其他方法啊?

------解决方案--------------------

如果进程没有结束,这样回收也只是表面上的回收而已!达不到实际回收的效果的

------解决方案--------------------

应使用“线程池”的思想:仅在程序初始化时创建线程,仅在程序结束退出前结束线程,杜绝在程序运行中创建或销毁线程。

参考下面://循环向a函数每次发送200个字节长度(这个是固定的)的buffer,

//a函数中需要将循环传进来的buffer,组成240字节(也是固定的)的新buffer进行处理,

//在处理的时候每次从新buffer中取两个字节打印

#ifdef WIN32

#pragma warning(disable:4996)

#endif

#include 

#include 

#include 

#ifdef WIN32

#include 

#include 

#include 

#define  MYVOID             void

#define  vsnprintf          _vsnprintf

#else

#include 

#include 

#include 

#define  CRITICAL_SECTION   pthread_mutex_t

#define  MYVOID             void *

#endif

//Log{

#define MAXLOGSIZE 20000000

#define MAXLINSIZE 16000

#include 

#include 

#include 

char logfilename1[]="MyLog1.log";

char logfilename2[]="MyLog2.log";

static char logstr[MAXLINSIZE+1];

char datestr[16];

char timestr[16];

char mss[4];

CRITICAL_SECTION cs_log;

FILE *flog;

#ifdef WIN32

void Lock(CRITICAL_SECTION *l) {

EnterCriticalSection(l);

}

void Unlock(CRITICAL_SECTION *l) {

LeaveCriticalSection(l);

}

void sleep_ms(int ms) {

Sleep(ms);

}

#else

void Lock(CRITICAL_SECTION *l) {

pthread_mutex_lock(l);

}

void Unlock(CRITICAL_SECTION *l) {

pthread_mutex_unlock(l);

}

void sleep_ms(int ms) {

usleep(ms*1000);

}

#endif

void LogV(const char *pszFmt,va_list argp) {

struct tm *now;

struct timeb tb;

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);

}

}

}

void Log(const char *pszFmt,...) {

va_list argp;

Lock(&cs_log);

va_start(argp,pszFmt);

LogV(pszFmt,argp);

va_end(argp);

Unlock(&cs_log);

}

//Log}

#define ASIZE    200

#define BSIZE    240

#define CSIZE      2

char Abuf[ASIZE];

char Cbuf[CSIZE];

CRITICAL_SECTION cs_HEX ;

CRITICAL_SECTION cs_BBB ;

struct FIFO_BUFFER {

int  head;

int  tail;

int  size;

char data[BSIZE];

} BBB;

int No_Loop=0;

void HexDump(int cn,char *buf,int len) {

int i,j,k;

char binstr[80];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值