相关疑难解决方法(0)

说明C#中volatile关键字的用法

我想编写一个程序,它可以直观地说明volatile关键字的行为.理想情况下,它应该是一个程序,它执行对非易失性静态字段的并发访问,并因此而获得不正确的行为.

在同一程序中添加volatile关键字应该可以解决问题.

那是我无法实现的.即使尝试多次,启用优化等,我总是会在没有'volatile'关键字的情况下获得正确的行为.

你对这个话题有什么看法吗?你知道如何在一个简单的演示应用程序中模拟这样的问题吗?它取决于硬件吗?

.net c# volatile

87
推荐指数
3
解决办法
1万
查看次数

挥发性使用的可重现的例子

我正在寻找一个可重现的示例,可以演示volatile关键字的工作原理.我正在寻找一些工作"错误"的东西,而没有标记为易变的变量,并且"正确"地使用它.

我的意思是一些示例,它将证明执行期间的写/读操作顺序与变量未标记为volatile时的预期顺序不同,并且当变量未标记为volatile时不同.

我认为我得到了一个例子但是在其他人的帮助下我意识到它只是一段错误的多线程代码.为什么volatile和MemoryBarrier不会阻止操作重新排序?

我还发现了一个链接,它演示了volatile对优化器的影响,但它与我正在寻找的不同.它表明对标记为volatile的变量的请求不会被优化.如何在C#中说明volatile关键字的用法

这是我到目前为止的地方.此代码未显示任何读/写操作重新排序的迹象.我正在寻找一个会展示的.

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Runtime.CompilerServices;

    namespace FlipFlop
    {
        class Program
        {
            //Declaring these variables 
            static byte a;
            static byte b;

            //Track a number of iteration that it took to detect operation reordering.
            static long iterations = 0;

            static object locker = new object();

            //Indicates that operation reordering is not found yet.
            static volatile bool continueTrying = true;

            //Indicates that Check method should continue.
            static volatile bool continueChecking = true;

            static …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading

11
推荐指数
2
解决办法
984
查看次数

为什么方法调用将非易失性变量的值刷新到主线程?

为什么吸气剂Val会模拟现场的波动val

我假设利用方法调用不是保持变量volatile的可靠方法.

(要试用它,构建版本并直接执行而不需要调试器.)

class Program
{
    private int val = 0;
    public int Val { get { return val; } }

    public static void Main()
    {
        var example = new Program();

        Task.Run(() => example.val++);

        while (example.val == 0) ; // Hangs if val is not volatile
        while (example.Val == 0) ; // Never seems to hang
    }
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading

5
推荐指数
1
解决办法
102
查看次数

标签 统计

c# ×3

.net ×2

multithreading ×2

volatile ×1