Drinking from both glasses: combining pessimistic and optimistic tracking of cross-thread dependences