[Mono-dev] ConcurrentStack with value type in 2.10

Alan alan.mcgovern at gmail.com
Mon Jul 23 12:45:06 UTC 2012


I cannot reproduce the problem either. What exact version of 2.10 did
you test against? It's possible the bug has already been fixed in a
newer release of the 2.10 series.

Alan

On 23 July 2012 13:32, Rodrigo Kumpera <kumpera at gmail.com> wrote:
> Hi Yuriy,
>
> With how many cores and on what CPU did managed to reproduce this?
> I'm running this on my 4 cores nehalem mac without any luck. I'll diff
> ConcurrentStack
> between 2.8 and 2.10 to see what could be.
>
> On Sun, Jul 22, 2012 at 5:10 AM, Yuriy Solodkyy <yuriy at couldbedone.com>
> wrote:
>>
>> Hi,
>>
>> It looks like the ConcurrentStack does not work with big enough
>> structures anymore.  12 bytes struct is enough to reproduce the
>> problem occasionally, 16 bytes structure to reproduce it immediately.
>> It worked fine in mono 2.8.  The following code shows that we may pop
>> inconsistent structure from the stack from time to time.
>>
>> using System;
>> using System.Collections.Concurrent;
>> namespace CocurrentTest {
>>         class MainClass {
>>                 struct Data {
>>                         public int A; public int B; public int C; public
>> int D;
>>                         public Data(int v) {
>>                                 A = v; B = -v; C = v; D = -v;
>>                         }
>>                 }
>>
>>                 public static void Main (string[] args) {
>>                         Console.WriteLine ("Hello World!");
>>                         var data = new byte[1024 * 1024];
>>                         var stack = new ConcurrentStack<Data> ();
>>
>>                         for (var i = 0; i < 50; i++) {
>>
>>                                 var thread = new System.Threading.Thread
>> (v => {
>>
>>                                         var rnd = new Random ();
>>                                         while (true) {
>>                                                 int pushCount = rnd.Next
>> (50);
>>                                                 int popCount = rnd.Next
>> (50);
>>
>>                                                 for (var k = 0; k <
>> pushCount; k++) {
>>
>>
>>                                                         var sample =
>> new Data (rnd.Next(Int32.MaxValue));
>>                                                         CheckSample
>> (sample);
>>
>>                                                         stack.Push
>> (sample);
>>                                                 }
>>
>>                                                 for (var k = 0; k <
>> popCount; k++) {
>>                                                         Data
>> retrievedSample = new Data();
>>                                                         if
>> (stack.TryPop (out retrievedSample)) {
>>
>> CheckSample (retrievedSample);
>>                                                         }
>>                                                 }
>>                                         }
>>                                 }
>>                                 );
>>
>>                                 thread.Start ();
>>                         }
>>                 }
>>
>>                 static void CheckSample (Data sample){
>>                         if (sample.A != -sample.B || sample.A !=
>> sample.C || sample.B != sample.D)
>>                                 throw new Exception (string.Format
>> ("Invalid sample detected"));
>>                 }
>>         }
>> }
>>
>>
>> --
>> Yuriy Solodkyy
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>


More information about the Mono-devel-list mailing list