Sooner or later, it all comes down to hardware. It's best kept synchronous if possible. Otherwise, it's necessary to synchronize, which is provably unreliable in finite time.
The problem comes down to making a call in a race condition. In general, you need an amplifier to magnify small differences. And, you need to give that amplifier time to work. The more gain, the less time, so gain is good. Even with lots of gain, though, there remains the possibility of a race so close that any real circuit will fail to synchronize. That's called SynchronizerFailure?. Here are a few failures I'm familiar with...
Do you have more information on this Space Shuttle failure?
The two major failures I saw on TV were both bad judgement calls by humans on the ground, having nothing to do with any computer - see LetTheHumanPullTheTrigger. (A trivial error is described in WhyTheShuttleIsLeftHanded; but it doesn't seem to have anything to do with synchronization either.)
I've also heard it called the "Metastability problem". -- DavidCary
"the metastable state is the bane of asynchronous digital systems." A good explanation of the (surprising) problems this causes in asynchronous circuits (and why it is not a problem in clocked circuits) is in the book ComputationStructures? by Ward and Halstead (section 4.6).
However, entire asynchronous microprocessors have been fabbed. (One can execute ARM MachineCode). Designing asynchronous logic is a bit tricky, but ClocklessLogic? does have some advantages.
Is there a better wiki for chatting about CPU design, FpgaCpus, etc? -- DavidCary