自适应型网站建设多少钱,阅读网站模板下载,做网站的费用计入哪个科目,wordpress编辑器增强插件【 声明#xff1a;版权所有#xff0c;欢迎转载#xff0c;请勿用于商业用途。 联系信箱#xff1a;feixiaoxing 163.com】 多线程编程一般都会涉及到锁的时候#xff0c;很多人可能觉得很意外#xff0c;为什么会需要这么一个锁。本质上#xff0c;这主要还是因为多线…【 声明版权所有欢迎转载请勿用于商业用途。 联系信箱feixiaoxing 163.com】 多线程编程一般都会涉及到锁的时候很多人可能觉得很意外为什么会需要这么一个锁。本质上这主要还是因为多线程的执行中本身一部分逻辑并不是原子操作导致的。有一个池塘喂鱼的例子最为经典。假设池塘有两个人同时去喂鱼每一个人喂鱼之前会先看一下池塘边上的牌子。假设牌子是红色的代表已经喂过了假设牌子是绿色的则代表鱼还没有喂过。鱼本身只能吃一顿如果连续喂的话那么鱼可能会撑死。 现在就会出现这么一个情况就是第一个人去喂鱼但是他还没有来得及翻牌子的时候第二个人来继续喂鱼。他一看鱼牌子是绿色的还没有喂那就就会选择继续投料。而他投料的同时并不知道第一个人之前已经投喂过了。所以这个时候鱼就会被撑死了。 所以为了解决这个问题os一般会提供一个锁的机制对于锁里面的操作一定是不能打断的。只有所有操作都完成之后才会释放自己的锁机制。为了解释锁是怎么使用的以及说明如果不用锁的话究竟有什么样的坏处可以通过c# wpf编写一个demo进行说明下。 1、设置界面 界面还是只有一个按钮和一个textbox。按钮下去的时候有两个thread同时递增1000万次查看两个thread递增之后总的数据次数是不是2000万。
Window x:ClassWpfApp.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:sysclr-namespace:System;assemblymscorlibxmlns:localclr-namespace:WpfAppmc:IgnorabledTitleLockSimulationDemo Height480 Width550GridStackPanelButton x:Namebutton ContentStart processing ClickStartButton_Click Height40 Margin5,40/TextBox x:NameResult TextWrappingWrap VerticalScrollBarVisibilityAuto HorizontalScrollBarVisibilityAuto Height200 Margin5//StackPanel/Grid
/Window相关界面显示如下 2、代码编写 代码编写主要就是按钮的回调函数。回调函数中主要使用了Thread类、ThreadStart类这两个。线程注册函数是WorkerThreadMethod。创建好两个thread之后就可以将他们start开始执行。 在线程注册函数中会各循环1000万次。之所以会循环这么多次是因为循环次数多了才能看到锁的效果。没有锁的话最终的累加次数不一定是2000万反之有了锁肯定是2000万这就是锁的用处所在。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Threading;namespace WpfApp
{public partial class MainWindow : Window{private int total 0;private readonly object _lockObject new object(); // lock for synchronization// construct functionpublic MainWindow(){InitializeComponent();}// button invoke functionprivate void StartButton_Click(object sender, RoutedEventArgs e){Thread newThread1 new Thread(new ThreadStart(WorkerThreadMethod));Thread newThread2 new Thread(new ThreadStart(WorkerThreadMethod));Result.Text ;total 0;button.IsEnabled false;newThread1.Start();newThread2.Start();}// thread entry functionprivate void WorkerThreadMethod(){for (int i 0; i 10000000; i){lock (_lockObject) // critical section{total 1;}}Application.Current.Dispatcher.Invoke(() {Result.AppendText(total.ToString() \n);button.IsEnabled true;});}}
}3、实验和验证 验证的话编译没有啥问题直接单击按钮即可。同时这个按钮是可以连续单击即一次结果出来之后可以反复测试的。中间测试的过程中可以通过注释掉lock代码的方式判断注释前后运行结果有没有差异。