求教,多线程安全问题?
有下面这样一个函数
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;
}
[解决办法]
首先定义一个类包装CRITICAL_SECTION
class CMyCritical
{
CRITICAL_SECTION m_section;
};
把CRITICAL_SECTION当作他的一个成员对象
给这个类提供以下三个方法
1. 构造函数,在这个函数里初始化临界区
2. 析构函数,在这里释放
3. operator CRITICAL_SECTION,这里直接返回那个成员
这样你可以用static CMyCritical对象定义临界区,让他自动初始化
后面就可以直接使用EnterCritcalSection 来guard了
[解决办法]
static CRITICAL_SECTION cs;
应放在call_in_thread函数外面: 程序启动时初始化cs,退出时销毁cs。
另,call_in_thread函数的写法有些问题,改造为:
- C/C++ code
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; }