6 ms·
Effective Go has always said: Do not communicate by sharing memory; instead, share memory by communicating. This approach can be taken too far. Reference coun
by Jabbles 11y ago
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 https://golang.org/doc/effective_go.html#sharing
- poizan42 11y agoReference counts are best done using interlocked increment/decrement primitives.
- catnaroek 11y agos/interlocked/atomic/
- chrisseaton 11y agoI wonder if there are any compilers which can replace mutex.lock { x++ } With a 'lock xaddl x 1' instruction.
- nly 11y agoIt'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
- pcwalton 11y agoThat 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.
- chrisseaton 11y agoYes 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.
- deleted 11y ago[deleted]
- pjmlp 11y agoJava and .NET will do it if you make use of InterlockedIncrement APIs.
- chrisseaton 11y agoBut 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.
- pjmlp 11y agoAh, I missed the point.
- mike_hearn 11y agoIt'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.
- deleted 11y ago[deleted]
- jupp0r 11y agoThere ist std::atomic in recent C++ flavors
- chrisseaton 11y agoRight. My question is whether we can translate locks which only reference a single variable, to use something like std::atomic, automatically.
- api 11y agoI thought Go had gc. Why would you ever need reference counts?
- voidlogic 11y agoNon-memory resources that exist within your application. Example: Perhaps once no instances of an object are in use, you want to remove that object from persistent storage such as a DB.
- api 11y agoDoes Go not have finalizers? These are mostly solved problems since the Smalltalk era. Haven't learned Go yet and from what I read I'd be better off with Rust or something that would stretch my brain more like Haskell. When I read about it I get the sense that we are reinventing stuff from the 90s. But hey, it's hip.
- catnaroek 11y agoSometimes you need to guarantee that resources are cleaned up in a timely fashion. Finalizers don't help here.
- hacknat 11y agoPiggy backing off @catnaroek, go does have finalizers too though.
- pcwalton 11y agoGo does have runtime.SetFinalizer: https://golang.org/pkg/runtime/#SetFinalizer https://golang.org/pkg/runtime/#SetFinalizer But beware of finalizer ordering issues.
- chrsm 11y agoExample: Recently built a small service that responds to requests and walks various files looking for data. The service can be asked to unload (close) the file, but it's hard to say whether it's in-use at the time without some kind of reference count to current requests using the file.
- mike_hearn 11y agoI'm not sure making an absolute statement ("do not...") followed by "... actually do, sometimes" is helpful. How is this different to any other language that gives you a toolbox of synchronisation primitives?