digitalmars.D.learn - Synchronized const methods
- =?iso-8859-2?B?VG9tZWsgU293afFza2k=?= (48/48) Jun 11 2010 If a synchronized method call sees that someone's already partying with ...
- Daniel Keep (2/2) Jun 11 2010 immutable means "no one can modify this."
- =?UTF-8?B?IkrDqXLDtG1lIE0uIEJlcmdlciI=?= (15/18) Jun 12 2010 So?
- =?iso-8859-2?B?VG9tZWsgU293afFza2k=?= (8/22) Jun 12 2010 "
If a synchronized method call sees that someone's already partying with its object, it waits. So far so good. Now here's something I don't quite get: if a *const* synchronized method call sees that another const synchronized method call is holding the lock, then why it needs to be held up? D features deep const; that's a promise strong enough to drop the sync'ing, no? Example: import std.stdio; import core.thread; shared class K { string value; this (string value) { this.value = value; } synchronized void metoda() const { foreach (i; 0..3) { writeln(Thread.getThis().name, " is calling metoda. My value is ", value); Thread.sleep(1_000_000); } } } class My_Thread : Thread { K k; this(K k, string name) { super(&run); this.k = k; this.name = name; } void run() { k.metoda(); } } void main() { K k = new K("some value"); (new My_Thread(k, "Thread 1")).start(); (new My_Thread(k, "Thread 2")).start(); } Now, sync'ing would be necessary if one of the threads could mutate K, but here? The output is: Thread 1 is calling metoda. My value is some value Thread 1 is calling metoda. My value is some value Thread 1 is calling metoda. My value is some value Thread 2 is calling metoda. My value is some value Thread 2 is calling metoda. My value is some value Thread 2 is calling metoda. My value is some value Tomek
Jun 11 2010
immutable means "no one can modify this." const means "someone might be able to modify this, but not you can't."
Jun 11 2010
Daniel Keep wrote:immutable means "no one can modify this." =20 const means "someone might be able to modify this, but not you can't."So? Basically, what the OP said, is that we need readers-writer locks [1]. A const synchronized method would use the read lock (and therefore several threads can access the same object through *const* synchronized methods simultaneously), but a non const synchronized method would use the read-write lock (which would prevent anyone else from accessing the same object through a synchronized method, be it const or not). Jerome [1] http://en.wikipedia.org/wiki/Readers-writer_lock --=20 mailto:jeberger free.fr http://jeberger.free.fr Jabber: jeberger jabber.fr
Jun 12 2010
Dnia 12-06-2010 o 09:28:58 J=E9r=F4me M. Berger <jeberger free.fr> napis= a=B3(a):Daniel Keep wrote:"immutable means "no one can modify this." const means "someone might be able to modify this, but not you can't.=So? Basically, what the OP said, is that we need readers-writer locks [1]. A const synchronized method would use the read lock (and therefore several threads can access the same object through *const* synchronized methods simultaneously), but a non const synchronized method would use the read-write lock (which would prevent anyone else from accessing the same object through a synchronized method, be it const or not). Jerome [1] http://en.wikipedia.org/wiki/Readers-writer_lockExactly. How is synchronization implemented in D right now? Would there be room t= o = let the lock distinguish reads & writes? Tomek
Jun 12 2010