算法原理:每个线程进入的时候都要取得一个编号,对于不同线程编号较小的较先运行,编号相同时进程号小的先运行。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace Bakery
{class Program{public static int[] data = new int[100000];public static int total = 10;private static object ojb = new object();static int num = 10;static int threads=4;static List<int> ticket = new List<int>(threads); // 保留票号static List<bool> entering = new List<bool>(threads); //记录线程是否要进入public static void addLock(int pid) // thread ID{//Console.WriteLine(pid);entering[pid] = true;int max = 0;for (int i = 0; i < threads; ++i){int current = ticket[i];if (current > max){max = current;}}ticket[pid]=max+1; entering[pid]=false;for (int i = 0; i < ticket.Count; ++i){if (i != pid){while (entering[i] == true) { ; } // wait while other thread picks a ticketwhile (ticket[i] != 0 && ( ticket[pid] > ticket[i]  ||(ticket[pid] == ticket[i] && pid > i))){ ; }}}// The critical section goes here...}public static void unlock(int pid){ticket[pid] = 0;}public static void changeValue(object pid){int p = Convert.ToInt32(pid.ToString());addLock(p);for (int i = 0; i < total; i++){num = num + 1;Console.WriteLine(num);}unlock(p);}public static void readValue(object pid){int p = Convert.ToInt32(pid.ToString());addLock(p);for (int i = 0; i < total; i++){num = num - 1;Console.WriteLine(num);}unlock(p);}static void Main(string[] args){ticket = new List<int>(threads);entering = new List<bool>(threads);for (int i = 0; i < threads;i++ ){ticket.Add(-1);entering.Add(false);}for (int i = 0; i < total; i++){data[i] = 0;}Stopwatch stopwatch = new Stopwatch();stopwatch.Start();int num = 10;Thread[] t = new Thread[num];t[0] = new Thread(new ParameterizedThreadStart(changeValue));t[1] = new Thread(new ParameterizedThreadStart(readValue));t[2] = new Thread(new ParameterizedThreadStart(readValue));t[3] = new Thread(new ParameterizedThreadStart(changeValue));stopwatch.Start();t[0].Start(0);t[1].Start(1);t[2].Start(2);t[3].Start(3);t[0].Join();t[1].Join();t[2].Join();t[3].Join();stopwatch.Stop();Console.WriteLine("运行时间" + stopwatch.ElapsedMilliseconds.ToString());Console.ReadKey();}}
}

Bakery Algorithm的c#实现用于多线程互斥访问临界资源相关推荐

  1. jmu-Java-07多线程-互斥访问 (5分)

    6-8 jmu-Java-07多线程-互斥访问 (5分) 定义Account类 属性: private int balance 方法: getter方法 void deposit(int money) ...

  2. java复选框互斥_jmu-Java-07多线程-互斥访问 (5分)

    6-8 jmu-Java-07多线程-互斥访问 (5分) 定义Account类 属性: private int balance 方法: getter方法 void deposit(int money) ...

  3. 基于Linux的kfifo移植到STM32(支持os的互斥访问)

    基于Linux的kfifo移植到STM32(支持os的互斥访问) 声明:本文为杰杰原创,转载请说明出处 https://blog.csdn.net/jiejiemcu/article/details/ ...

  4. C++11多线程---互斥量、锁、条件变量的总结

    关于互斥量std::mutex的总结 互斥量用于组成代码的临界区.C++的多线程模型是基于内存的,或者说是基于代码片段的,这和我们操作系统学习的临界区概念基本一致,但是与Golang不同,Golang ...

  5. java多线程互斥锁_浅谈Java多线程互斥锁

    为了解决竞争条件带来的问题,我们可以对资源上锁.多个线程共同读写的资源称为共享资源,也叫临界资源.涉及操作临界资源的代码区域称为临界区(Critical Section).同一时刻,只能有一个线程进入 ...

  6. C#多线程时对同一资源加锁实现互斥访问

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)

    一. 引子 最近想自己写个简单的 WEB SERVER ,为了先练练手,熟悉下在LINUX系统使用基本的进程.线程.互斥等,就拿以前学过的 OS 问题开开刀啦.记得当年学读者写者问题,尤其是写者优先的 ...

  8. 【Linux】多线程--互斥锁

    文章目录 前言 基础概念 互斥量mutex 多线程模拟抢票(没加锁情况) 为何多线程访问临界资源是不安全 互斥锁相关接口 多线程模拟抢票(有加锁) 互斥锁实现的基本原理 前言 为什么线程需要同步和互斥 ...

  9. 临界资源 互斥访问 内核中的up和down函数

    信号量(semaphore)是用于保护临界区的一种常用方法.只有得到信号量的进程才能执行临界区代码,而没有得到信号量的进程进入休眠等待状态. Linux系统中与信号量相关的操作主要有如下4种. 1 定 ...

最新文章

  1. web标准,我们去向何方?一些想法...
  2. IBM Thinkpad T43-44U 升级到 2G 内存后少了 66M
  3. 绩效面谈流程,阿里是这样做的
  4. Windows x64内核学习笔记(一)—— 环境与配置
  5. window.location.href不打开新窗口_嘿,这条微博值得一看:不登录如何访问页面
  6. 牛客-139 I. Substring(后缀数组 or 后缀自动机)
  7. 我们凭什么相信 5G 很安全?
  8. Linux扩展根分区大小
  9. 你必须要知道的架构知识~第二章 代码是否面向对象,要看你的继承怎么用
  10. 为什么css效果在本地测试没问题,上传到服务器后却显示位置乱动,css下拉菜单本地正常,上传后360浏览器中显示错位,火狐、IE8显示正常...
  11. [tensorflow]tensorflow 顺序模型(Sequential model)
  12. ES6、7学习笔记(尚硅谷)-6-形参默认值的设置
  13. java环境变量的作用和含义_java环境变量的配置及各环境变量的含义 | 学步园
  14. 车险赔付率分析报告_车险经营情况分析报告模板.ppt
  15. 5款非常好用的免费数据库建模工具(免费)
  16. 【Excel文件合并工具】
  17. MA Chapter 3 Presenting information(SRCharlotte)
  18. 一、ubuntu16.04下无法连接wifi(试遍所有方法及解决方案)
  19. 移动支付时代的手机和app安全设置
  20. Newman基本使用

热门文章

  1. 测井计算机使用的总线,1553总线在测井系统中的应用及实现
  2. 软件程序员成功的秘诀
  3. Java+SSM流浪猫狗救助领养网站(含源码+论文+答辩PPT等)
  4. JAVASE23天从入门到精通_Day05
  5. html圆形边框怎么弄,CSS怎样做出自适应圆形边框?
  6. (产品资讯)微信城市服务——武汉
  7. 五步准备一份漂亮的Java简历!
  8. 【project1】对数据读取处理和写入
  9. 关于云计算的个人理解
  10. 3. 单选题 计算机网络最突出的优点是,计算机网络最突出的优点是()。A.计算精度高B.内存容量大C.资源共享...