归结一下子:C#线程同步的几种步骤
我们在编程的时分,有时会运用多线程来解决问题,例如你的程序急需在后台老板处置一大堆数据,但还要施用户界面居于可操作状态;或许你的程序亟需访问一些外部资源悉数据库或网络资料等。这些景况你都可以创设一个头线程去处置,然则,多线程不可逆转地会带回一个问题,乃是线程同步的问题。如其这个问题处置糟糕,我们就会失去一些非预期的结果。
在网上也看过一些至于线程同步的稿件,实则线程同步有好几种步骤,下部我就容易的做一下子归结。
1、volatile关键字
volatile是最容易的一种同步步骤,当然容易是要付出代价的。它只好在变量一级做同步,volatile的含意乃是告诉微处理器, 不用将我放入工作内存储器, 请直接在主存操作我。(【转自www.bitsCN.com 】)因而,应多线程与此同时访问该变量时,都将直接操作主存,从本质上作到了变量共享。
能够被标识为volatile的务必是以次几类别型:(摘自MSDN)
•Any reference type.
•Any pointer type (in an unsafe context).
•The types sbyte, byte, short, ushort, int, uint, char, float, bool.
•An enum type with an enum base type of byte, sbyte, short, ushort, int, or uint.
如:
Code
public class A
{
private volatile int _i;
public int I
{
get { return _i; }
set { _i = value; }
}
}
但volatile并不能实现真个的同步,由于它的操作级别只停留在变量级别,而不是原子级别。如果是在单微处理器系统中,是没任何问题的,变量在主存中没有机会被其他人批改,由于唯有一个微处理器,这就叫做processor Self-Consistency。但在多处理器系统中,或者就会有问题。 每个微处理器都有自个儿的data cach,并且被更新的数据也未见得会立马写回来主存。之所以可能会促成不同步,但这种景况很难发作,由于cach的读写速度对等快,flush的频次也对等高,唯有在压力测试的时分才有可能发生,并且几率十分十分小。
2、lock关键字
lock是一种比较好用的容易的线程同步模式,它是透过为给定对象获取互斥锁来兑现同步的。它可以保证书当一个线程在要害代码段的时分,另一个线程不会进去,它唯其如此等候,待到那个线程对象被开释,且不说线程出了临界区。用法: lock的参数务必是基于引述门类的对象,不用是根本部类像bool,int什么的,这么基本不能同步,原因是lock的参数要求是对象,如若传到int,准定要
相关文档:
1
<asp:UpdatePanelID="UpdatePanel1"
UpdateMode="Conditional"
runat="server">
<ContentTemplate>
<asp:Button ID="Button1"
......
<Language from="SQL" To="C#">
<Type from="bigint" To="long" />
<Type from="binary" To="object" />
<Type from="bit" To="bool" />
<Type from="char" To="string" />
<Type from="datetime" To="DateTime" ......
原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWriter和BinaryReader来读写,突然想到能不能用XML来序列化?于是在网上查了些资料便写了些实践性代码,做些记录,避免以后忘记。
序列化对象
public class People
......
public class yzzSerialize
{
private yzzSerialize()
{ }
private static yzzCache cache = new yzzCache();
public static T GetfromXml<T>(string xmlpath, T t)
{
using (FileStream fs = new FileStream(xmlpath, FileMode.Open, FileAcces ......
RT。先贴代码
C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Value_Ref_test1
{
class Program
{
static void Main(string[] args)
{
point a = new point (10,10) ;
point b = a;
......