我的問題是,如果我使用多線程上相同的字符串有時訪問使用多線程相同的字符串(StringBuilder)對
字符串將不會進行更換。(我寫了這個記事本上這樣的語法可能
使用錯誤)
System.Thread ...其他ofcourse
class ....
{
private static StringBuild container = new StringBuilder();
static void Main(...)
{
container.Append(Read From File(Kind of long));
Thread thread1 = new Thread(Function1);
Thread thread2 = new Thread(Function2);
thread1.Start();
thread2.Start();
//Print out container
}
static void Function1
{
//Do calculation and stuff to get the Array for the foreach
foreach (.......Long loop........)
{
container.Replace("this", "With this")
}
}
//Same goes for function but replacing different things.
static void Function2
{
//Do calculation and stuff to get the Array for the foreach
foreach (.......Long loop........)
{
container.Replace("this", "With this")
}
}
}
現在有時一些元素沒有得到更換。 所以我的解決方案是調用container.Replace在不同的
方法,並做一個「鎖」哪個工作,但它是正確的方式?
private class ModiflyString
{
public void Do(string x, string y)
{
lock (this)
{
fileInput.Replace(x, y);
}
}
}
我從來沒有想過鎖定stringbuilder本身,非常好。謝謝, – 2009-08-12 20:26:08
菲爾的第二個例子就是當我提到一個「虛擬」對象時所指的。然而,我認爲他第一個鎖定容器的例子是他們中最好的。由於容器表示線程之間共享的數據,因此您需要鎖定該數據。如果您使用我的示例,則存在以下問題:如果您的線程嘗試爲完全獨立的容器調用ModifyString.Do,則它們將相互阻塞,即使它們所使用的容器完全不同。所以你會傷害表現。所以我的例子實際上是一個糟糕的實現。 – AaronLS 2009-08-12 20:28:39
感謝@arronls現在我的程序正在工作:) – 2009-08-12 20:39:29