这两天在处理一个相应问题,一个系统希望实行命令互斥,举个例子就是如果我打开了两个命令窗口,分别在这两个窗口中运行两种操作,这些操作是互斥的,即命令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 }
lock_environment

相关文章: