最近查错,发现这样的代码,多线程访问有潜在问题。
int create_obj_from_config()
{
static int sl_option = -1;
if ( -1 == sl_option )
{
critical_section.enter();
sl_option = get_int_from_config_file( key_value, default_option );
trace_to_comport( "option = %d/n", sl_option );
critical_section.leave();
}
}
错误的现象是 : 把 trace_to_comport 去除后, 程序就起不来了。
把 trace_to_comport换成 Sleep(10),还能正常起来。
原因是sl_option在访问(read)之前,没有保护。
修改方法:
int create_obj_from_config()
{
static int sl_option = -1;
if ( -1 == sl_option )
{
critical_section.enter();
if ( -1 == sl_option )
{
sl_option = get_int_from_config_file( key_value, default_option );
//trace_to_comport( "option = %d/n", sl_option );
}
critical_section.leave();
}
}
6225

被折叠的 条评论
为什么被折叠?



