重复运算结果面包店算法(C#code) [英] Duplicate math result in Bakery Algorithm (C# code)

查看:121
本文介绍了重复运算结果面包店算法(C#code)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

<一个href="http://stackoverflow.com/questions/29745205/index-out-of-bounds-but-its-looks-like-nothing-wrong-with-the-loop">Index出界时,用参数来创建新的线程 - 继续我的previous的话题,现在我得到了一个新的问题,我的我的面包店算法code!

Index out of bounds when create new thread with parameters? - Continue to my previous topic , now i got a new problem with my my Bakery Algorithm code !

下面是我的code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace BakeryAlgorithm
{
    class Program
    {
        static int threads = 10;
        static string x = "";
        static int count = 0;
        static int[] ticket = new int[threads];
        static bool[] entering = new bool[threads];

        public static void doLock(int pid)
        {
            for (int i = 0; i < threads; i++)
            {
                ticket[i] = 0;
                entering[i] = false;
            }
                entering[pid] = true;

            int max = 0;

            for (int i = 0; i < threads; i++)
            {
                if (ticket[i] > ticket[max]) { max = i; }
            } 

            ticket[pid] = 1+max;
            entering[pid] = false;


            for (int i = 0; i < threads; ++i)
            {
                if (i != pid)
                {
                    while (entering[i]) 
                    {
                        Thread.Yield();   
                    } 
                    while (ticket[i] != 0 && (ticket[pid] > ticket[i] ||
                              (ticket[pid] == ticket[i] && pid > i)))
                    {
                        Thread.Yield();
                    }
                }
            }  
           if (x == "C" || x == "c")
Console.WriteLine("[System] PID " + pid.ToString() + " get    into critical section"); 
        }

        public static void unlock(int pid)
        {
            ticket[pid] = 0;
            count++;
            Console.WriteLine("[Thread] PID " + pid.ToString() + " complete.");
        }

        public static void arrayInit()
        {
            for (int i = 0; i < threads; i++)
            {
                ticket[i] = 0;
                entering[i] = false;
            }
        }

        public static void simThread(int i)
        {
            doLock(i);
            if (x == "C" || x=="c")
            Console.WriteLine("[Thread] PID " + i.ToString() + " begin to process...");
            //Do some thing ????
            Random rnd = new Random((int)DateTime.Now.Ticks & 0x0000FFFF);
            int a = rnd.Next(1,99); 
            int b = rnd.Next(1,99);
            int c = rnd.Next(1,4);

            int d = 0;
            string o="";

            if (c == 1)
            {
                d = a + b;
                o="+";
            }
            else if (c == 2)
            {
                d = a * b;
                o="*";
            }
            else if (c == 3)
            {
                d = a / b;
                o="/";
            }
            else
            {
                d = a - b;
                o="-";
            }

            if (x == "C" || x == "c")
                Console.WriteLine("Math Result : " + a.ToString() + o + b.ToString() + "=" + d.ToString());
            unlock(i);
        }
        [STAThread]
        static void Main(string[] args)
        {
            arrayInit();
            string choice="C";
            while (choice == "C" || x == "c")
            {
                        Console.WriteLine("Process log (C=Yes,K=No) : ");
                        x = Console.ReadLine();
                        if (x == "")
                            x = "C";

                Console.Clear();
                Console.WriteLine("----------------------------------");
                Console.WriteLine("Bakery Algorithm C#");
                Console.WriteLine("Number of threads : " + threads.ToString());
                Console.WriteLine("Process Log...");
                Console.WriteLine("----------------------------------");

                Thread[] threadArray = new Thread[threads];
                for (int i = 0; i < 10; i++)
                {
                    int copy = i;
                    threadArray[i] = new Thread(() => simThread(copy));
                    if (x == "C" || x == "c")
                    Console.WriteLine("[System] PID " + i.ToString() + " created");
                    threadArray[i].Start();
                }

                Console.ReadLine();
                Console.WriteLine("----------------------------------");
                Console.WriteLine("Complete processed " + count.ToString() + " threads !");
                count = 0;
                Console.WriteLine("----------------------------------");


                        Console.WriteLine("You want to restart  (Yes=C or No=K)");
                        choice = Console.ReadLine();
                        if (choice == "")
                            choice = "C";
            }
        }
    }
}

结果在这里:

The result are here :

2*2=4
2*2=4 << duplicated
3*2=6
4*2=8
4*6=24
4*2=8 << duplicated

....然后继续重复值(任意位置)!

.... and continue with duplicate values ( random position ) !

在这里希望有人能帮助!

Hope somebody here can help !

推荐答案

您必须创建一个不同的随机数为每个线程(的更多详细信息

You must create a different random number for each thread (more details)

这样试试这个code在你的主要方法:

so try this code in your main method:

for (int i = 0; i < 10; i++)
{
     int temp = i;
     threadArray[i] = new Thread(() => simThread(temp));
     Console.WriteLine("[He Thong] PID " + i.ToString() + " duoc khoi tao");
     threadArray[i].Start();
     Thread.Sleep(20);
}

和以下code。在你的线程:

and the following code in you threads:

Random rand = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);

现在你可以确保你产生不同的随机数为每个线程。

now you can ensure you produce different random number for each thread.

这篇关于重复运算结果面包店算法(C#code)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆