有下面这样一个函数
char *call_in_thread()
{
static char *ret_val = NULL; if(NULL != ret_val)
{
free(ret_val);
ret_val = NULL;
} if(NULL == (ret_val = (char *)malloc(MAX_RET_VAL_LENGTH)))
{
return ret_val;
} …… return ret_val;
}我想在不改变函数原型的情况下能够在多线程环境正常工作,请教各位大侠,如何修改?
如果使用临界区,又在何时初始化和删除临界区?char *call_in_thread()
{
static char *ret_val = NULL;
static CRITICAL_SECTION cs;
EnterCriticalSection(&cs); if(NULL != ret_val)
{
free(ret_val);
LeaveCriticalSection(&cs);
ret_val = NULL;
} if(NULL == (ret_val = (char *)malloc(MAX_RET_VAL_LENGTH)))
{
LeaveCrticalSection(&cs);
return ret_val;
} …… LeaveCriticalSection(&cs); return ret_val;
}
char *call_in_thread()
{
static char *ret_val = NULL; if(NULL != ret_val)
{
free(ret_val);
ret_val = NULL;
} if(NULL == (ret_val = (char *)malloc(MAX_RET_VAL_LENGTH)))
{
return ret_val;
} …… return ret_val;
}我想在不改变函数原型的情况下能够在多线程环境正常工作,请教各位大侠,如何修改?
如果使用临界区,又在何时初始化和删除临界区?char *call_in_thread()
{
static char *ret_val = NULL;
static CRITICAL_SECTION cs;
EnterCriticalSection(&cs); if(NULL != ret_val)
{
free(ret_val);
LeaveCriticalSection(&cs);
ret_val = NULL;
} if(NULL == (ret_val = (char *)malloc(MAX_RET_VAL_LENGTH)))
{
LeaveCrticalSection(&cs);
return ret_val;
} …… LeaveCriticalSection(&cs); return ret_val;
}
解决方案 »
- 如何在Wince的对话框中响应WM_NCLBUTTONDBLCLK消息
- 控件与变量绑定的问题
- 好几年了,想学VC,转来转去,还是没入门,我可怎么般啊
- 如何调用 存储过程并且返回数据集,关键问题是,存储过程有输入参数。
- 关于命令行输出的问题
- 取不到图标咋回事儿?
- Modem拨号出现Error 732错误
- 怎么运行一个程序,并且得到它占用的内存大小,运行时间?
- 下面两个程序的输出是什么?两者有什么区别?请指教!
- 介绍几个下栽 ATL、COM的英文电子书籍的网站!!!
- 求将Hex(B3 CC D0 F2 BD F8 D0 D0 D0 E8 D2 AA D2 BB B6 A8)字符串转换成汉字字符串(程序进行需要一定)的函数
- 如何写 读取文件时候的选择框
{
CRITICAL_SECTION m_section;
};把CRITICAL_SECTION当作他的一个成员对象给这个类提供以下三个方法1. 构造函数,在这个函数里初始化临界区
2. 析构函数,在这里释放
3. operator CRITICAL_SECTION,这里直接返回那个成员这样你可以用static CMyCritical对象定义临界区,让他自动初始化
后面就可以直接使用EnterCritcalSection 来guard了
{ CRITICAL_SECTION m_section;
public:
CMyCritical(){InitializeCriticalSection(&m_section);};
operator CRITICAL_SECTION& () {return m_section;};//如果这个不行,则换一个GetCriticalSection
~CMyCriticalSection(){DeleteCriticalSection(&m_section);};
};char *call_in_thread()
{
static char *ret_val = NULL;
static CMyCritical cs;
EnterCriticalSection(&cs); if(NULL != ret_val)
{
free(ret_val);
LeaveCriticalSection(&cs);
ret_val = NULL;
} if(NULL == (ret_val = (char *)malloc(MAX_RET_VAL_LENGTH)))
{
LeaveCrticalSection(&cs);
return ret_val;
} …… LeaveCriticalSection(&cs); return ret_val;
}
应放在call_in_thread函数外面: 程序启动时初始化cs,退出时销毁cs。另,call_in_thread函数的写法有些问题,改造为:char *call_in_thread()
{
static char *ret_val = NULL;
EnterCriticalSection(&cs); if(NULL != ret_val)
{
free(ret_val);
// LeaveCriticalSection(&cs); // 去掉,不能Leave,还没有malloc
ret_val = NULL;
} // 这里没有必要判断
// if(NULL == (ret_val = (char *)malloc(MAX_RET_VAL_LENGTH)))
// {
// LeaveCrticalSection(&cs);
// return ret_val;
// } ret_val = (char *)malloc(MAX_RET_VAL_LENGTH);
if (ret_val)
{
// Do something here .
...
} LeaveCriticalSection(&cs); return ret_val;
}
{
static char *ret_val = NULL;
static CRITICAL_SECTION cs; InitializeCriticalSection(&cs);
EnterCriticalSection(&cs); if(NULL != ret_val)
{
free(ret_val);
ret_val = NULL;
LeaveCriticalSection(&cs);
return;
} if(NULL == (ret_val = (char *)malloc(MAX_RET_VAL_LENGTH)))
{
LeaveCrticalSection(&cs);
return ret_val;
} …… LeaveCriticalSection(&cs);
DeleteCriticalSection(&cs); return ret_val;
}
另外有些退出路径没有执行必要的清理,参考上面的那个版本。