小编Tse*_*sef的帖子

线程和内隐记忆障碍

在涉及线程时,试图理解.net的内存模型.这个问题是严格的理论问题,我知道它可以通过其他方式解决,例如使用lock或标记_taskvolatile.

以下面的代码为例:

class Test
{
    Task _task;
    int _working = 0;

    public void Run()
    {
        if (Interlocked.CompareExchange(ref _working, 1, 0) == 0)
        {
            _task = Task.Factory.StartNew(() =>
            {
                //do some work...
            });
            _task.ContinueWith(antecendent => Interlocked.Exchange(ref _working, 0));
        }
    }

    public void Dispose()
    {
        if (Interlocked.CompareExchange(ref _working, _working, 0) == 1)
        {
            _task.ContinueWith(antecendent => { /*do some other work*/ });
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在做出以下假设:

  1. Run可以多次调用(来自不同的线程),并且在调用之后永远不会Dispose被调用.
  2. Dispose 将被称为恰好一次.

现在我的问题是,_task(在Dispose方法中)的值是否总是一个"新的"值,这意味着它是从"主存储器"中读取而不是从寄存器中读取的?从我一直在阅读的内容 …

c# multithreading memory-barriers task-parallel-library

8
推荐指数
1
解决办法
379
查看次数

Task.Wait方法(CancellationToken)

有人可以向我解释一下Task.Wait(CancellationToken)重载的用法吗?MSDN确实说了很多......

这就是我通常处理任务取消的方式:

        var source = new CancellationTokenSource();
        var task = Task.Factory.StartNew(() => 
        {
            while (true)
            {
                source.Token.ThrowIfCancellationRequested();
            }
        }, source.Token);

        try
        {
            task.Wait();
        }
        catch (AggregateException exc)
        {
            exc.Flatten().Handle(e => e is OperationCanceledException);
        }
Run Code Online (Sandbox Code Playgroud)

那么什么时候将令牌传递给Wait方法有用呢?

c# multithreading task-parallel-library cancellation-token

6
推荐指数
2
解决办法
2337
查看次数

vim/gvim关闭和隐藏之间的区别

我对VIM不熟悉,我想知道:closewindow命令和:hidewindow命令之间的区别.我已经阅读了文档,但他们似乎都在做同样的事情......

vim

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