各位大侠好,我现在在一个类里,需要用到多线程访问一个BYTE[]成员变量,如何才能在一个线程访问时,保证另一个线程不对它做修改呢?能不能给个例子,非常感谢
解决方案 »
- c# 正则表达式,匹配方括号中的字符串
- 问一个关于绘制折线的问题(Graphics) 在线等!!!
- 关于button图片切换 winfrom的
- 如何用c#创建一个DBF文件?
- [高分-顶者有分]针对TreeView如何实现使用左键拖拽移动节点,而使用右键或[ctril+左键]拖拽复制节点?
- C#文件保存读取怎么出现乱码
- c# 如何通过USB实现PC和Surface共享网络以及通讯?
- Button控件的DialogResult属性的用法
- 求助专家!!!!!
- 200分!简单问题,如何用正则表达式来检测yyyy-mm-dd是否合理?在线等待..
- 关于处理字符串的问题,大家都帮帮我啊
- C# 急用!帮助文档实现
lock(locker)
{
//这里放访问你的byte[]
}
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。此语句的形式如下:Object thisLock = new Object();
lock (thisLock)
{
// Critical code section.
}
http://www.vchome.net/dotnet/dotnetdocs/dotnet1.htm
多个线程都需要访问BYTE[]成员变量,那么要设置一个标志(bool islock)当第一个线程需要修改BYTE[]时,将islock=true,修改完islock=false;每次一个线程修改这个成员变量时,都先判断islock,如果是true就不能修改而等待,如果为false,则可以修改并重复设置islock状态,从而可以保证成员变量只被一个线程修改中
假设两个线程同时访问islock,此时islock==true;那么两个线程因为同时访问的islock,所以都认为他是可以修改的,把islock=false;于是执行下面的代码,这不出错了?!!
这个所谓的“简单”方法比 lock 至少低效百倍。而且如果在高并发的环境之下还击有可能因为判断 islock 与修改 byte[] 并不是原子操作而出现 14 楼提到的错误
哦,漏了一点,如果在判断 islock == false 通过了,然后就是 islock = true, 接着处理 BYTE[], 要使这个过程出现异常了,非常好,islock 永远都是 true,所有线程都不用干活了。
你用你的方法开个100个线程试试就知道了!
{
lock(o){
//对byte[]的操作
}
}
volatile 只是个声明,没有作用的,MSDN 有很详细的说明,建议你去翻翻多线程环境下,只有原子操作才是安全的。
volatile 只是声明变量可以被多个线程访问,没有保护作用啊而且重点不在 isLock 上面。而是两条线程同时走到 if (isLock == false) 这一句上面。判断当然是通过的,然后就一起下到后面的处理语句中,结果可想而知
我不知道你看 MSDN 的时候为何跳过第一句 The volatile keyword indicates that a field might be modified by multiple threads that are executing at the same time. Fields that are declared volatile are not subject to compiler optimizations that assume access by a single thread. This ensures that the most up-to-date value is present in the field at all times.然后就直接下到The volatile modifier is usually used for a field that is accessed by multiple threads without using the lock statement to serialize access这里来了第一句已经写得很清楚了。如果你对 lock 有疑问的话,那个 lock 也是个链接来的,进去看看而你说到的“多个线程访问但不使用 lock 语句对访问进行序列化的字段的字段”有很多,通常都是在一些32为系统中属于原子操作的东西, "The volatile keyword can be applied to fields of these types" 下面已经列出你可以看出 long, double 都不在其中
{
}
这样不行?
恩,这句我看到了,就是说这个变量不能被多个线程同时修改,也就是解决多线程互斥修改?
... _mtx.WaitOne();
/* 这里访问和修改byte[] */
_mtx.ReleaseMutex();