Concurrent programming: principles and practice Andrews, Gregory R.