gpt4 book ai didi

.net - .NET的StringBuilder是线程安全的吗

转载 作者:行者123 更新时间:2023-12-03 09:10:57 34 4
gpt4 key购买 nike

MSDN文档中StringBuilder的常规“线程安全”部分指出:

...any instance members are not guaranteed to be thread safe...



但是该语句似乎已被复制并粘贴到了框架中的几乎每个类上:

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

但是,Gavin Pugh的这些博客文章提到了 StringBuilder的线程安全行为:

http://www.gavpugh.com/2010/03/23/xnac-stringbuilder-to-string-with-no-garbage/

http://www.gavpugh.com/2010/04/01/xnac-avoiding-garbage-when-working-with-stringbuilder/

此外,Reflector揭示了StringBuilder的来源,并附带了注释
在SSCLI资料中,还建议了许多实现注意事项以确保线程安全:

http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Text&type=StringBuilder

有没有人对 StringBuilder实例在多个并发线程之间是否可以安全共享有更多的了解?

最佳答案

绝对不;这是一个通过反射器从4.0提升的简单示例:

[SecuritySafeCritical]
public StringBuilder Append(char value)
{
if (this.m_ChunkLength < this.m_ChunkChars.Length)
{
this.m_ChunkChars[this.m_ChunkLength++] = value;
}
else
{
this.Append(value, 1);
}
return this;
}

该属性仅处理调用方,而不处理线程安全性。这是 绝对不是线程安全的。

更新:查看他引用的源代码,这显然不是当前的.NET 4.0代码库(比较一些方法)。也许他在谈论特定的.NET版本,或者XNA-但通常情况下 而不是。 4.0 StringBuilder没有 ,没有一个 m_currentThread字段,Gavin的原始资料使用该字段;有一个提示(未使用的常量 ThreadIDField),它表示 使用来存在,但是...不再存在。

如果您想要 直接取消打样,请在4.0上运行;它很可能会给出错误的长度(我在4k区域中看到了一些,在2k区域中看到了一些-应该恰好是5000),但是其他一些 Append方法(例如 Append(char))往往会抛出异常,具体取决于时间:
var gate = new ManualResetEvent(false);
var allDone = new AutoResetEvent(false);
int counter = 0;
var sb = new StringBuilder();
ThreadStart work = delegate
{
// open gate when all 5 threads are running
if (Interlocked.Increment(ref counter) == 5) gate.Set();
else gate.WaitOne();

for (int i = 0; i < 1000; i++) sb.Append("a");

if (Interlocked.Decrement(ref counter) == 0) allDone.Set();
};
for(int i = 0 ; i < 5 ; i++)
{
new Thread(work).Start();
}
allDone.WaitOne();
Console.WriteLine(sb.Length);

关于.net - .NET的StringBuilder是线程安全的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8831385/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com