Most active commenters
  • chrisseaton(4)

←back to thread

Go channels are bad

(www.jtolds.com)
298 points jtolds | 14 comments | | HN request time: 0.826s | source | bottom
Show context
Jabbles ◴[] No.11210740[source]
Effective Go has always said:

Do not communicate by sharing memory; instead, share memory by communicating.

This approach can be taken too far. Reference counts may be best done by putting a mutex around an integer variable, for instance.

https://golang.org/doc/effective_go.html#sharing

replies(3): >>11210862 #>>11210978 #>>11210990 #
1. poizan42 ◴[] No.11210862[source]
Reference counts are best done using interlocked increment/decrement primitives.
replies(2): >>11210871 #>>11211088 #
2. catnaroek ◴[] No.11210871[source]
s/interlocked/atomic/
3. chrisseaton ◴[] No.11211088[source]
I wonder if there are any compilers which can replace

    mutex.lock { x++ }
With a 'lock xaddl x 1' instruction.
replies(4): >>11211325 #>>11211581 #>>11211703 #>>11212909 #
4. nly ◴[] No.11211325[source]
It's conceivable, if you made mutexes compiler/language intrinsic, but as long as you're calling pthread_mutex_lock, the compiler has to assume that that pthread library, which is linked dynamically, is interchangeable, and can do anything it likes to memory. That includes mutating x
replies(1): >>11213078 #
5. pjmlp ◴[] No.11211581[source]
Java and .NET will do it if you make use of InterlockedIncrement APIs.
replies(1): >>11211672 #
6. chrisseaton ◴[] No.11211672{3}[source]
But I think InterlockedIncrement is just 'lock xaddl x 1', so using InterlockedIncrement would be to do it manually.

I'm asking if any compiler can take a statement which uses a high level, general purpose lock and increments a variable inside it using conventional language expressions, and convert it to use 'lock xaddl x 1' (perhaps via InterlockedIncrement or whatever other intrinsics you have) instead.

I only know Java well, not .NET, but I'm pretty sure no Java compiler does it.

replies(1): >>11213205 #
7. mike_hearn ◴[] No.11211703[source]
It's not quite the same thing but recent JVMs can translate synchronised blocks into Intel TSX transactions, which means multiple threads can run inside the lock at once, with rollback and retry if interference is detected at the hardware (cache line) level. So yeah .... almost. But it's fancy and cutting edge stuff.
replies(1): >>11211715 #
8. ◴[] No.11211715{3}[source]
9. jupp0r ◴[] No.11212909[source]
There ist std::atomic in recent C++ flavors
replies(1): >>11213355 #
10. pcwalton ◴[] No.11213078{3}[source]
That hasn't inhibited optimizations for a long time. Disassemble a call to printf("Hello world") in optimized clang output and look at what it turns into.
replies(2): >>11213389 #>>11214716 #
11. pjmlp ◴[] No.11213205{4}[source]
Ah, I missed the point.
12. chrisseaton ◴[] No.11213355{3}[source]
Right. My question is whether we can translate locks which only reference a single variable, to use something like std::atomic, automatically.
13. chrisseaton ◴[] No.11213389{4}[source]
Yes if the library is covered by a standard just like the language is, then the compiler can make assumptions. Also threads are a language feature in C and C++ now.
14. ◴[] No.11214716{4}[source]