我编写了一个实用程序来为java方法创建一个CFG(控制流图),该方法的节点是基本块而不是指令.
我不能认为异常抛出是CFG中的边缘.原因是:
静态代码分析器如何解决这个问题?
我被困在这一点上.如果我必须继续,我应该怎么做呢?
编辑:在我的情况下,我可以限制对那些可以指定抛出位置和异常的用例的支持.这解决了我的第二个问题.我仍然想知道通用静态代码分析器如何管理它.
在Java中,我们可以这样做:
synchronized(a) {
while(condition == false) {
a.wait(time);
}
//critical section ...
//do something
}
Run Code Online (Sandbox Code Playgroud)
上面是一个条件同步块,它等待条件成功才能执行关键部分。
当执行 a.wait 时(例如 100 毫秒),线程在该持续时间内退出临界区,并且由对象 a 执行同步的其他一些临界区,这使得条件为真。
当条件成功时,当前线程下次进入临界区并评估条件时,循环退出并执行代码。
需要注意的要点: 1. 多个临界区由同一个对象同步。2. 线程仅在等待期间不处于临界区。一旦wait出来,线程又回到临界区。
下面是在 Swift 4 中使用 DispatchSemaphore 执行相同操作的正确方法吗?
while condition == false {
semaphore1.wait(duration)
}
semaphore1.wait()
//execute critical section
semaphore1.signal()
Run Code Online (Sandbox Code Playgroud)
当我们进入临界区时,条件可能会被修改。
因此,我们可能必须执行如下操作才能实现 Java 行为。在 Swift 中是否有更简单的方法来做到这一点?
while true {
//lock
if condition == false {
//unlock
//sleep for sometime to prevent frequent polling
continue
} else {
//execute critical section
//...
//unlock
break
} …Run Code Online (Sandbox Code Playgroud)