digitalmars.D - [RFC] "lock" statement and "mutex" type.
- Dejan Lekic (16/16) Mar 14 2006 I think D should have mutex type and lock statement as part of D languag...
- Sean Kelly (8/23) Mar 14 2006 I'm not familar with that. What's the behavior? Is it a tryLock where
- Dejan Lekic (21/21) Mar 14 2006 Hi Sean,
- BCS (18/46) Mar 14 2006 The simple tryLock would allow for timeout:
- Dejan Lekic (7/7) Mar 14 2006 BCS, on contrary - it is not considered - that is why I began this
- Graham St Jack (12/21) Mar 14 2006 I agree that better threading support is needed in D. The synchronized
- Dejan Lekic (6/6) Mar 14 2006 My suggesion in form of lock(someMutex) {} else {} satisfies both type o...
- BCS (9/16) Mar 15 2006 One other thought: How should deadlock be handled?
- Sean Kelly (12/31) Mar 15 2006 No. It's not unusual to need more locks later if you're using a lock
I think D should have mutex type and lock statement as part of D language, in the similar fashion as in Modula-3. D programmer would than be able to write: mutex myMutex; lock (myMutex) { doSomething(); } else { continueSomething(); } What do others think about this? Reason for this above is that my personal opinion is that D should be the language with full support for threads. I would even add "thread" keyword somehow... Kind regards Dejan
Mar 14 2006
Dejan Lekic wrote:I think D should have mutex type and lock statement as part of D language, in the similar fashion as in Modula-3. D programmer would than be able to write: mutex myMutex; lock (myMutex) { doSomething(); } else { continueSomething(); } What do others think about this?I'm not familar with that. What's the behavior? Is it a tryLock where the else block handles the failure? Does the syntax account for lock acquisition with a timeout? That said, I agree that D needs better concurrency support, and that broader mutex support is one aspect of this. In particular, I'd at least like to have some way to not wait indefinitely for a lock to become available. Sean
Mar 14 2006
Hi Sean, yes, i did not think about acquisition with a timeout maybe following syntax change is what we would like to have: lock (<mutex variable>[, timeout]) You understood everything else. My was plain simple trylock. Following code is an example of code without try: lock (myMutex) // blocks calling thread { doSomething(); } as we slightly changed the main idea (from my previous post), we could have something like: lock (myMutex, 1000) // blocks calling thread for 1 second { // if mutex "myMutex" is not unlocked during that time doSomething(); // it will exit the lock() block and execute continue() } // function. continue(); Regards ----------- Dejan Lekic http://dejan.lekic.org
Mar 14 2006
The simple tryLock would allow for timeout: while(!timeout()) { lock(mutex) { go(); break; } else continue; } A bit clunky but... I'm glad that native support for threads is being considered, I think that it would be a vary good thing. It would allow for some quite nice features like: thread t1; t1.run = &fn; // launch thread if(t1mustDie) t1.throw new KillThread; // throw an exception in t1 Dejan Lekic wrote:Hi Sean, yes, i did not think about acquisition with a timeout maybe following syntax change is what we would like to have: lock (<mutex variable>[, timeout]) You understood everything else. My was plain simple trylock. Following code is an example of code without try: lock (myMutex) // blocks calling thread { doSomething(); } as we slightly changed the main idea (from my previous post), we could have something like: lock (myMutex, 1000) // blocks calling thread for 1 second { // if mutex "myMutex" is not unlocked during that time doSomething(); // it will exit the lock() block and execute continue() } // function. continue(); Regards ----------- Dejan Lekic http://dejan.lekic.org
Mar 14 2006
BCS, on contrary - it is not considered - that is why I began this thread... :) So far all participants in this discussion agrees that D (language) needs this what we discuss. Sure everything depends on Mr. Bright. ----------- Dejan Lekic http://dejan.lekic.org
Mar 14 2006
Dejan Lekic wrote:BCS, on contrary - it is not considered - that is why I began this thread... :) So far all participants in this discussion agrees that D (language) needs this what we discuss. Sure everything depends on Mr. Bright. ----------- Dejan Lekic http://dejan.lekic.orgI agree that better threading support is needed in D. The synchronized keyword is a great start, but more is needed. My opinion is that try_lock() on a mutex isn't a good idea - it is better to use conditions. You use mutexes to keep threads "apart" from each other (the synchronized keyword does this very well), making sure that no thread retains a lock for long. You use conditions to enable a thread to "block" for potentially extended periods, without any thread retaining a lock on the mutex. A couple of other related posts are: http://www.digitalmars.com/d/archives/digitalmars/D/31340.html http://www.digitalmars.com/d/archives/digitalmars/D/34392.html
Mar 14 2006
My suggesion in form of lock(someMutex) {} else {} satisfies both type of concurrent programming fans. If you do not want lock to try, than just forget else block. :) Without else block lock() would behave like pthread_mutex_lock(), with else block it would behave like pthread_mutex_trylock() . Yes, i agree conditional variables should also be there, however i did not think so much about how to do it...
Mar 14 2006
Dejan Lekic wrote:My suggesion in form of lock(someMutex) {} else {} satisfies both type of concurrent programming fans. If you do not want lock to try, than just forget else block. :) Without else block lock() would behave like pthread_mutex_lock(), with else block it would behave like pthread_mutex_trylock() . Yes, i agree conditional variables should also be there, however i did not think so much about how to do it...One other thought: How should deadlock be handled? options: 1> it's not, that's the programmer's problem. 2> some unspecified, the compiler/runtime just does it. 3> multiple locks can be requested at the same time e.i. lock(mutex1, mutex2) // block untill mutex 1&2 can both be held but no more can be acquired until the first ones are released. 4> other.
Mar 15 2006
BCS wrote:Dejan Lekic wrote:Either 1 or 3.My suggesion in form of lock(someMutex) {} else {} satisfies both type of concurrent programming fans. If you do not want lock to try, than just forget else block. :) Without else block lock() would behave like pthread_mutex_lock(), with else block it would behave like pthread_mutex_trylock() . Yes, i agree conditional variables should also be there, however i did not think so much about how to do it...One other thought: How should deadlock be handled? options: 1> it's not, that's the programmer's problem. 2> some unspecified, the compiler/runtime just does it. 3> multiple locks can be requested at the same time e.i. lock(mutex1, mutex2) // block untill mutex 1&2 can both be heldbut no more can be acquired until the first ones are released.No. It's not unusual to need more locks later if you're using a lock heirarchy. Only locks on the same level must be acquired simultaneously. That said, this whole lock business is a huge pain, and I'm hoping we can do better with D. Herb Sutter gave a talk on his Concur library for C++ the other day, and the ideas seem pretty reasonable (though he didn't really answer my question on how to handle the possibility of multiple parallel exceptions in C++ -- perhaps not an issue in D). In any case, I may try doing something similar in D. I think delegates might make the whole process quite streamlined. Sean
Mar 15 2006