[Mono-dev] ConcurrentQueue<T> issues (repros)
Greg Young
gregoryyoung1 at gmail.com
Tue Sep 25 13:56:05 UTC 2012
I will pull in a few minutes and give it a try.
Cheers,
Greg
On Tue, Sep 25, 2012 at 4:44 PM, Jérémie Laval <jeremie.laval at gmail.com> wrote:
> Could you try master?
>
> --
> Jérémie Laval
> http://neteril.org
>
>
>
> On Thu, Sep 20, 2012 at 2:38 PM, Greg Young <gregoryyoung1 at gmail.com> wrote:
>>
>> Here are some tests that show some of the failure modes of concurrent
>> queue (all work in CLR impl)
>>
>> On my machine (8 cores within 1 second of running for all failures).
>> The worst is the last one where anything larger than a reference gives
>> partial reads.
>>
>> in gist if you prefer: https://gist.github.com/3755979
>>
>> Unhandled Exception:
>> System.NullReferenceException: Object reference not set to an instance
>> of an object
>> at System.Collections.Concurrent.ConcurrentQueue`1[T].TryDequeue
>> (System.Collections.Concurrent.T& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueReference>c__AnonStorey1.<>m__0
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>> [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException:
>> Object reference not set to an instance of an object
>> at System.Collections.Concurrent.ConcurrentQueue`1[T].TryDequeue
>> (System.Collections.Concurrent.T& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueReference>c__AnonStorey1.<>m__0
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>>
>>
>>
>> private static void TestMonoConcurrentQueueReference()
>> {
>> var queue = new ConcurrentQueue<object>();
>> var waits = new List<AutoResetEvent>();
>> for (int i = 0; i < 5; i++)
>> {
>> int q = i;
>> waits.Add(new AutoResetEvent(false));
>> var t = new Thread(x =>
>> {
>> for (int j = 0; j < 100000000; j++)
>> {
>> if (j % 1000000 == 0) Console.Write(".");
>> queue.Enqueue(new object());
>> object item;
>> if (queue.TryDequeue(out item))
>> {
>>
>> }
>> }
>> waits[q].Set();
>> });
>> t.Start();
>> }
>> Console.WriteLine("waiting.");
>> waits.ForEach(x => x.WaitOne());
>> Console.WriteLine("done.");
>>
>> }
>>
>>
>> I end up in the else {} on try dequeue here don't think I should ever
>> be allowed to (and dont end up there in MS impl)
>>
>> struct TestStruct
>> {
>> public long X;
>> public long Y;
>>
>> public TestStruct(long x, long y) : this()
>> {
>> X = x;
>> Y = y;
>> }
>> }
>>
>> private static void TestMonoConcurrentQueueBiggerThanReference()
>> {
>> var queue = new ConcurrentQueue<TestStruct>();
>> var waits = new List<AutoResetEvent>();
>> for(int i=0;i<5;i++)
>> {
>> int q = i;
>> waits.Add(new AutoResetEvent(false));
>> var t = new Thread(x =>
>> {
>> for(int j=0;j<100000000;j++)
>> {
>> if(j% 1000000 == 0)
>> Console.Write(".");
>> queue.Enqueue(new
>> TestStruct(0x11223344, 0x99887766));
>> TestStruct item;
>> if(queue.TryDequeue(out
>> item))
>> {
>> if(item.X !=
>> 0x11223344) throw new Exception("bad x");
>> if(item.Y !=
>> 0x99887766) throw new Exception("bad y");
>> } else
>> {
>> throw new
>> Exception("unable to read."); <~~~~ should never hit this.
>> }
>> }
>> waits[q].Set();
>> });
>> t.Start();
>> }
>> Console.WriteLine("waiting.");
>> waits.ForEach(x => x.WaitOne());
>> Console.WriteLine("done.");
>>
>> }
>>
>>
>> For good measure lets take out the exception in the last about not
>> being able to read when it should be able to (eg comment out the
>> throw)
>>
>> Unhandled Exception:
>> System.Exception: bad y
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>>
>> Unhandled Exception:
>> System.NullReferenceException: Object reference not set to an instance
>> of an object
>> at
>> System.Collections.Concurrent.ConcurrentQueue`1[ConsoleApplication1.Program+TestStruct].TryDequeue
>> (ConsoleApplication1.TestStruct& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>>
>> Unhandled Exception:
>> System.NullReferenceException: Object reference not set to an instance
>> of an object
>> at
>> System.Collections.Concurrent.ConcurrentQueue`1[ConsoleApplication1.Program+TestStruct].TryDequeue
>> (ConsoleApplication1.TestStruct& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>>
>> Unhandled Exception:
>> System.NullReferenceException: Object reference not set to an instance
>> of an object
>> at
>> System.Collections.Concurrent.ConcurrentQueue`1[ConsoleApplication1.Program+TestStruct].TryDequeue
>> (ConsoleApplication1.TestStruct& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>>
>> Unhandled Exception:
>> System.NullReferenceException: Object reference not set to an instance
>> of an object
>> at
>> System.Collections.Concurrent.ConcurrentQueue`1[ConsoleApplication1.Program+TestStruct].TryDequeue
>> (ConsoleApplication1.TestStruct& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>> [ERROR] FATAL UNHANDLED EXCEPTION: System.Exception: bad y
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>> [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException:
>> Object reference not set to an instance of an object
>> at
>> System.Collections.Concurrent.ConcurrentQueue`1[ConsoleApplication1.Program+TestStruct].TryDequeue
>> (ConsoleApplication1.TestStruct& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>> [ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException:
>> Object reference not set to an instance of an object
>> at
>> System.Collections.Concurrent.ConcurrentQueue`1[ConsoleApplication1.Program+TestStruct].TryDequeue
>> (ConsoleApplication1.TestStruct& result) [0x00000] in <filename
>> unknown>:0
>> at
>> ConsoleApplication1.Program+<TestMonoConcurrentQueueBiggerThanReference>c__AnonStorey3.<>m__2
>> (System.Object x) [0x00000] in <filename unknown>:0
>> at System.Threading.Thread.StartInternal () [0x00000] in <filename
>> unknown>:0
>>
>>
>> private static void TestMonoConcurrentQueueBiggerThanReference()
>> {
>> var queue = new ConcurrentQueue<TestStruct>();
>> var waits = new List<AutoResetEvent>();
>> for(int i=0;i<5;i++)
>> {
>> int q = i;
>> waits.Add(new AutoResetEvent(false));
>> var t = new Thread(x =>
>> {
>> for(int j=0;j<100000000;j++)
>> {
>> if(j% 1000000 == 0)
>> Console.Write(".");
>> queue.Enqueue(new
>> TestStruct(0x11223344, 0x99887766));
>> TestStruct item;
>> if(queue.TryDequeue(out
>> item))
>> {
>> if(item.X !=
>> 0x11223344) throw new Exception("bad x");
>> if(item.Y !=
>> 0x99887766) throw new Exception("bad y");
>> } else
>> {
>> //throw new
>> Exception("unable to read."); <~~~~ should never hit this.
>> }
>> }
>> waits[q].Set();
>> });
>> t.Start();
>> }
>> Console.WriteLine("waiting.");
>> waits.ForEach(x => x.WaitOne());
>> Console.WriteLine("done.");
>>
>> }
>>
>> --
>> Le doute n'est pas une condition agréable, mais la certitude est absurde.
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
--
Le doute n'est pas une condition agréable, mais la certitude est absurde.
More information about the Mono-devel-list
mailing list