读书人

求教多线程安全有关问题

发布时间: 2012-02-28 13:06:36 作者: rapoo

求教,多线程安全问题?
有下面这样一个函数
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;       } 

读书人网 >VC/MFC

热点推荐