Some Issues With Synchronized
Sean Kelly
sean at invisibleduck.org
Wed Jan 4 12:12:04 PST 2012
On Dec 23, 2011, at 8:49 PM, Andrew Wiley wrote:
> On Fri, Dec 23, 2011 at 8:33 PM, Andrew Wiley <wiley.andrew.j at gmail.com> wrote:
>> On Fri, Dec 23, 2011 at 1:25 AM, Somedude <lovelydear at mailmetrash.com> wrote:
>>> On windows XP with DMD 2.057, I get
>>> Queue1: deadlock
>>> Queue2: works
>>> Queue3: works
>>
>> Yes, I posted another (much shorter) post describing the issue with
>> Queue1. In short, since Queue1 is a synchronized class, the
>> constructor is synchronized (which is mostly worthless). As a
>> consequence, when I replace the lock in the middle of the function,
>> bad things happen when the runtime tries to unlock the lock at the end
>> and sees the new lock.
>>
>> This version of Queue1 shows a very hacky way to get around this:
>> ---
>> synchronized class Queue1 {private: bool _work; Condition
>> _cond;public: this() { auto lock = new Mutex(this); //
>> initialize the monitor for this object so we can use the same lock in
>> the Condition lock.lock(); // HACK: acquire the lock so we can
>> unlock it at the end of the function _cond = new
>> Condition(lock); _work = false; } void doWork() {
>> while(!_work) (cast()_cond).wait(); _work = false;
>> writeln("did work"); return; } void addWork() { _work
>> = true; (cast()_cond).notify(); writeln("added work");
>> }}---
>> Queue2 looks like a bug where GDC is acquiring all locks twice in
>> synchronized functions, and since the condition variable only unlocks
>> the lock once, a deadlock results. I'll get a bug report up about it
>> shortly.
>
> Gah, my hacked/fixed Queue1 got garbled:
> ---
> synchronized class Queue1 {
> private:
> bool _work;
> Condition _cond;
> public:
> this() {
> auto lock = new Mutex(this); // initialize the monitor for this object
This assumes that there is no existing monitor for the object. At best you'll get a memory leak here.
More information about the Digitalmars-d
mailing list