这两天在处理一个相应问题,一个系统希望实行命令互斥,举个例子就是如果我打开了两个命令窗口,分别在这两个窗口中运行两种操作,这些操作是互斥的,即命令2要等待命令1执行完成后再执行。
这看似可以用简单的锁机制来实现,但实际处理时还要判断1号窗口的进程状态,用户2不会无线等待用户1的命令执行,会去系统中查看用户1的命令执行情况,如果是正在执行则继续等待,如果这个进程被暂停或者有其他情况,则用户2可以从反馈中知道具体信息
1 sub lock_environment { 2 my ($self) = @_; 3 4 return SUCCESS if $self->get_parent(); 5 my $process_info = $self->get_process_info(); 6 7 while ($self->_validate_environment_lock() == ERR_ENV_LOCKED) { 8 printf( 9 "%s is running cvc, PID: %s, will retry in 10 seconds, please wait...........\n", 10 $process_info->{user_id}, 11 $process_info->{process_id} 12 ); 13 sleep(10); 14 } 15 16 my @ret = $self->_update_env_lock_info( 17 $$, 18 $self->get_login_id(), 19 $self->get_current_environment(), 20 strftime("%Y-%m-%d %H:%M:%S", localtime())); 21 return @ret unless $ret[0] == SUCCESS; 22 23 return SUCCESS; 24 }