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

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. 【洛谷习题】小A点菜
  2. 使用火炬之光资源(转)
  3. 对于大型公司项目平台选择j2ee的几层认识
  4. [收藏]编译器内置的一些有用的调试宏
  5. Keyboard Control
  6. JavaScript学习笔记(四)
  7. 什么是分布式查询mysql_基础普及之什么是分布式SQL
  8. python with as 用法_你在 Python 中常常写的 with..as.. 到底是个啥?
  9. 浅谈实时语音质量监控系统
  10. 百宝,神烦云免费网络验证autojs实例代码
  11. cass等距离等分线段的命令键_教你用CAD将线段等分,弧线也可定距等分!
  12. 手握流量密码,万粉不是梦
  13. Intention Oriented Image Captions with Guiding Objects
  14. forward_list
  15. 6个超好用的电影网站,各种高清大片任意看,不用花钱不用注册!
  16. STM32内部flash详解(1)
  17. C++ std map unordered_map hash_map 的查找性能测试代码及结果
  18. tcpip协议与服务器的关系,RS232转TCPIP的TCP工作模式选择
  19. 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=61c74kbnuf9n
  20. keil5 stm32f03c8t6 printf重定向到串口和TFT 1.44 LCD屏

热门文章

  1. 1000 linux问题
  2. 物联网导论第一章第四章观后总结
  3. tensorflow2caffe(1) : 如何将tensorflow框架下训练得到的权重转化为caffe框架下的权重参数
  4. Ble Sig Mesh 协议从零到深入
  5. 河北 涉密计算机系统集成资质,浙江国家涉密系统集成资质
  6. 湖北经济学院大学计算机基础,大学计算机基础教学方法探讨
  7. 基于安卓Android手机微博系统客户端app
  8. java版 推箱子,俄罗斯方块,诗歌默写,坦克!由瑶哥特改造哦!
  9. Linux项目:自主web服务器
  10. ESD防护选型思路里的内容