Non-Blocking Algorithms for Parallel Programming