Hi Zheng,
The "why" question may be better answered on the golang-dev@ mailing
list. TSAN is just a tool that checks the existing memory model, it
does not define/introduce rules.
By "simultaneous" model you seem to refer to the so-called
"sequentially consistent" model. It's commonly rejected by all
practical languages (C, C++, Go, Java, LKMM) b/c it's too expensive to
implement (will require too much unneeded synchronization).
It's not a problem with HB model per-se. HB model can handle that as
well if we add enough HB edges between everything (e.g. what you
mention in bullet 2). So it's only a question of what exactly HB edges
are defined by a memory model. Sequentially consistent MM can also be
expressed as HB model.
Re bullet 2. There are 2 levels: external guarantees vs current
implementation details. It's generally a bad idea to provide external
guarantees for all current implementation details. E.g. you promised
users that channels provide sequentially consistent guarantees, but
tomorrow we want to optimize channels and replace mutexes with
finer-grained atomic operations, but now we can't because we
over-promised things (you can never remove/weaken guarantees b/c it
will break existing correct programs).