小编maf*_*afu的帖子

在非事务性文件系统中实现原子文件写入

许多常见的文件系统不提供原子操作,但是在某些情况下以原子方式写入文件非常重要。我试图为这个问题提出解决方案。

我做了以下假设:

  • 使用中的文件系统支持inode级别的原子操作(例如NTFS)。这意味着移动删除是原子的。
  • 只有程序本身才能访问文件。
  • 一次只有一个程序实例,它以单线程方式运行。
  • 为简单起见,每次都写入整个文件内容(即截断写入)。

这就留下了以下问题:写入文件时,程序可能会中断,并且文件中只剩下部分内容要写入。

我提出以下过程:

  1. 写新的内容到一个临时文件
  2. 将原始文件“ 原始”移动到一个临时位置备份
  3. 移动
  4. 删除备份

新建文件和备份文件与原始文件是有区别的(例如,它们的前缀可以不同,或者可以在同一卷上的单独目录中)。同时,它们的名称应直接映射到相应的原始名称(例如,只需使用相同的文件名)。

但是,这还不能使操作原子化。该过程可能会中断步骤1、2、3或4:

  1. 留下一个可能不完整的New
  2. 移动是原子的,但是现在缺少目标文件。这两个新的备份存在并且是完整的。
  3. Move是原子的,但是有一个未使用的Backup。在被替换的内容
  4. 删除是原子的。

使用先前的假设2和3,程序必须在崩溃后重新启动。在启动过程中,它应执行以下恢复检查:

  • 如果 存在“ 新建”,但“ 备份”不存在,则在步骤1或之后崩溃。删除“ 新建”,因为它可能不完整。
  • 如果存在“ 新建”并且“ 备份”也存在,那么我们在步骤2之后崩溃。继续执行步骤3。
  • 如果备份存在,但新的不也一样,我们一步后坠毁3.第4步继续。

仅使用原子操作的恢复过程本身将在中断后继续从中断处继续进行。

我相信这个想法可以确保对单个程序进行原子写入。这些问题仍然存在:

  • 当使用同一程序的多个实例时,恢复过程会干扰其他程序中当前正在进行的文件写入。
  • 仅读取但不写入的外部程序通常会获得正确的结果,但是如果同时对请求的条目执行写操作,则它们可能会错误地找不到任何条目。

可以通过使用策略(例如,检查其他实例,并拒绝对其他用户的目录访问)来解决这些问题(先前的假设未包括在内)。

最后,我的问题是:这样做有意义吗,或者过程中存在缺陷?是否有任何问题阻止这种方法在实践中使用?

filesystems file-io transactions atomicity

4
推荐指数
1
解决办法
1576
查看次数

C#readonly in C++(与const的细微差别)

关于readonlyC#提及的C++等价物有很多问题const.然而,到目前为止,我发现没有,据我所知,实际上是正确的,甚至没有提到我在此之后的细节.

可以在ctor(spec)中设置只读字段(甚至多次).这允许在最终确定值之前执行各种操作.另一方面,C++中的Const的行为略有不同(在C++和C#中),因为它需要在ctor运行之前使最终值可用.

有没有办法仍然实现readonlyC++ 的行为?

c# c++ constructor const readonly

4
推荐指数
1
解决办法
382
查看次数

BigInteger的性能非常大

我正在考虑使用BigInteger类来存储10-1000 MB范围内的数字.有任何人对此有经验吗?极大数字是否有实际或隐含的限制?

.net biginteger

4
推荐指数
1
解决办法
2363
查看次数

为什么这个链表中不需要显式引用?

在这个可变链表实现中,没有Ref{ListNode{T}}

mutable struct ListNode{T}
    data::T
    prev::ListNode{T}
    next::ListNode{T}
end
Run Code Online (Sandbox Code Playgroud)

要编辑列表,它使用类似 的代码next.prev = prev

我通常的理解是结构体被嵌入到位(就像 C 中的那样)。这不允许在不完全重新创建列表的情况下编辑列表。要拥有指向结构的引用/指针,可以使用Ref{ListNode{T}}.

从代码来看,这种理解显然是错误的:prev::ListNode{T}已经是一个可以轻易改变的指针了。但我不明白为什么会这样。Julia 中的结构默认嵌入为指针吗?可能只有它们是可变的?

我在文档中找不到该行为的具体描述。它讨论了堆/堆栈分配,但没有讨论直接分配与指针分配的更基本问题。

linked-list julia

4
推荐指数
1
解决办法
100
查看次数

C#覆盖等于使用"as"和专门的正确性,灵活性和性能方法

我想知道在C#中实现正确,灵活和快速Equals的最佳方法,几乎可以用于任何类和情况.我认为性能需要专门的Equals(将实际类的对象作为参数).为了避免代码重复,一般Equals应该调用专门的Equals.即使在继承的类中,也应该只执行一次空检查.

我终于想出了这个设计:


class MyClass
{
    public Int32 SomeValue1 = 1;
    public Int32 SomeValue2 = 25;

    // Ignoring GetHashCode for simplicity.

    public override bool Equals(object obj)
    {
        return Equals (obj as MyClass);
    }

    public bool Equals(MyClass obj)
    {
        if (obj == null) {
            return false;
        }

        if (!SomeValue1.Equals (obj.SomeValue1)) {
            return false;
        }

        if (!SomeValue2.Equals (obj.SomeValue2)) {
            return false;
        }

        return true;
    }
}

class MyDerivedClass : MyClass
{
    public Int32 YetAnotherValue = 2;

    public …
Run Code Online (Sandbox Code Playgroud)

c# null equals code-duplication

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

C#如何从VS2008代码指标中排除生成的代码?

如何从Visual Studio 2008代码指标中排除生成的代码(如Windows窗体设计器相关代码)?

我一直在挖掘,但我没有找到任何解决方案.DebuggerHiddenDebuggerNonUserCode没有任何效果.

c# code-generation code-metrics visual-studio-2008

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

C#输入文本框的验证:float

这个简单的任务给我带来了一些麻烦.我只想让用户输入任何成功float.TryParse进入Textboxish控件的文本.

我可以使用普通的TextBox并检查一些btnOK_Click中的Text,但这显然很蹩脚.此外,有一个很好的内置MaskedTextBox控件,但我没有设置它的掩码等于float.TryParse.此外,它似乎仅在发生焦点变化时检查有效性.

在网上挖掘带来了一些有趣的想法,但没有一个像我想的那样好.

你是怎么解决这个问题的?我是否只是错过了一个明显的解决方案,还是我必须自己实现这个功能?

我知道SO上有一些类似的线程,但没有找到可行的解决方案.

更新:是的,WinForms.

c# floating-point validation textbox maskedtextbox

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

正则表达式:可选组

我想拆分这样的字符串:

abc//def//ghi
Run Code Online (Sandbox Code Playgroud)

在第一次出现之前和之后的一部分//:

a: abc
b: //def//ghi
Run Code Online (Sandbox Code Playgroud)

我正在使用这个正则表达式:

(?<a>.*?)(?<b>//.*)
Run Code Online (Sandbox Code Playgroud)

到目前为止哪个工作正常.

但是,有时候//源字符串中缺少了这一点,显然正则表达式无法匹配.如何使第二组可选?

abc类似的输入应匹配:

a: abc
b: (empty)
Run Code Online (Sandbox Code Playgroud)

我尝试(?<a>.*?)(?<b>//.*)?但是在Expresso中留下了很多NULL结果,所以我猜这是错误的想法.

regex

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

如何将IEnumerable <IEnumerable <Foo >>减少到IEnumerable <Foo>?

对不起,奇怪的标题.我想要实现的目标很简单:

IEnumerable<IEnumerable<Foo>> listoflist;
IEnumerable<Foo> combined = listoflist.CombineStuff();
Run Code Online (Sandbox Code Playgroud)

例:

{{0, 1}, {2, 3}} => {0, 1, 2, 3}
Run Code Online (Sandbox Code Playgroud)

我很肯定有一个Linq表达式...

旁注:列表可能很大.

c# linq ienumerable

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

可以改进IEqualityComparer的这种实现吗?

我没有看到这个代码有任何问题,但感觉我错过了一些东西.也许可以减少行数.或者甚至有一个错误需要修复?我愿意接受任何建议.

public class NameComparer : IEqualityComparer<FileInfo>
{
    public bool Equals (FileInfo x, FileInfo y)
    {
        if (x == null) {
            return y == null;
        }

        if (y == null) {
            return false;   
        }

        return x.Name.Equals (y.Name);
    }

    public int GetHashCode (FileInfo obj)
    {
        return obj.Name.GetHashCode ();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# iequalitycomparer

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