|ZYCWPF| 今天看多线程的,但是对volatile这个关键字不理解,怎么感觉用static不是也是一样的效果吗? 大家帮我说说static和volatile的区别static我清楚是做什么用的但volatile什么时候用呢?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 volatile修饰的变量无需lock就可以在多线程内共享,它可以有效保证在多个cpu下更新而刷新各自的缓存。volatile的性能更高,它底层会使用cpu的自旋锁指令。 volatile表示数据字段可能被其它线程修改。比如拿msdn上的例子来说:public class Worker{ private volatile bool _shouldStop; public void DoWork() { while (!_shouldStop) { Console.WriteLine("Worker thread: working..."); } Console.WriteLine("Worker thread: terminating gracefully."); }}如果_shouldStop不声明为volatile,编译器优化时就可能省去这个!_shouldStop检查判断,因为它的值始终应该是进行方法时候的那个值,但是加了volatile就不会做这样的优化,循环每次都会去检查,因为它可能被其它线程修改。 public class Worker { //private volatile bool _shouldStop; //上面这语句我感觉改为效果也是一样的啊?所以我看不出作用!谢谢 public static bool _shouldStop; public void DoWork() { while (!_shouldStop) { Console.WriteLine("Worker thread: working..."); } Console.WriteLine("Worker thread: terminating gracefully."); } } 本帖最后由 caozhy 于 2012-12-04 22:51:17 编辑 看一下这个帖子:http://stackoverflow.com/questions/133270/illustrating-usage-of-the-volatile-keyword-in-c-sharp/1284007#1284007我用它的代码也试了,打开优化或release模式下,程序死循环。msdn自带的例子却产生不了这样的现象,按上面帖子里的解释是编译器越来越聪明,会尽量找出这种可能导致错误的优化而不做优化。 懂计算机几何学的进来 求几何图形旋转算法 在WinForm中,这样简单的[图片+文字]按钮是如何做出来的? 100分求广域网通讯完整例子下载地址。 一个C#类库的问题 有没有用 C# 开发服务程序,并且在服务程序中成功加载虚拟设备驱动的? 关于文件覆盖的问题. [源代码]推荐包含图片的下拉框(ComboBox, Dropdown, DropdownList) c#的繁簡轉換2 怎么样取得Excel表格内的内容的所有信息(字体内容,大小等) 请大家告诉我,我的 WebService 已经做好,也用asp.net做了个调用它的 WebSite,数据库我用的是ms SQL ,我想确实的投入运行了,要怎么弄 .Net 缓存回调函数为什么只有在手动remove的时候才执行呢 .net 2.0中 2个集合循环,寻找高效率方法..
比如拿msdn上的例子来说:public class Worker
{
private volatile bool _shouldStop; public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("Worker thread: working...");
}
Console.WriteLine("Worker thread: terminating gracefully.");
}
}如果_shouldStop不声明为volatile,编译器优化时就可能省去这个!_shouldStop检查判断,因为它的值始终应该是进行方法时候的那个值,但是加了volatile就不会做这样的优化,循环每次都会去检查,因为它可能被其它线程修改。
public class Worker
{
//private volatile bool _shouldStop;
//上面这语句我感觉改为效果也是一样的啊?所以我看不出作用!谢谢
public static bool _shouldStop;
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("Worker thread: working...");
}
Console.WriteLine("Worker thread: terminating gracefully.");
}
}
http://stackoverflow.com/questions/133270/illustrating-usage-of-the-volatile-keyword-in-c-sharp/1284007#1284007
我用它的代码也试了,打开优化或release模式下,程序死循环。msdn自带的例子却产生不了这样的现象,按上面帖子里的解释是编译器越来越聪明,会尽量找出这种可能导致错误的优化而不做优化。