0

我有一個相當簡單的場景: 有些數據需要寫入可以分區的數據庫(相當大的集合)。但我有兩個問題:並行:如何正確同步

  1. 輕鬆一:想有一個選項,打印進度條,讓想知道有多少記錄迄今已插入不時(有點共用的反在線程中)。

  2. 較難一:每個記錄需要伴隨一個時間戳。時間戳有一個開始時間和一個時間間隔。不幸的是,時間戳不是記錄的一部分,但是在順序編程中可以簡單地通過將當前時間遞增一個特定時間間隔來計算。

到目前爲止,問題是:如何正確實現上述約束?是否有可能將循環體與促進迭代時執行的代碼(++inewTimeStamp = oldTimeStamp.AddSeconds(...))分離,以便這種代碼將總是在單個線程上執行,與將要並行化的循環體相反?如果儘管我很樂意得到任何指針/名稱/關鍵字,謝謝。

+0

分貝和網絡聽起來像你的瓶頸......你有基準嗎? – 2010-10-17 11:16:02

+0

你說得很對。基準計劃已儘快完成。 – BreakPhreak 2010-10-17 12:21:28

回答

1

對於第1部分,您可以使用互斥鎖(lock statement),或者甚至只是使用互斥鎖的Interlocked methods之一。

int counter = 0; 
object counterLock = new object(); 
void IncreaseCounter() 
{ 
    lock (counterLock) 
     counter++; 
} 

int GetCounter() 
{ 
    lock (counterLock) 
     return counter; 
} 

int counter = 0; 
void IncreaseCounter() 
{ 
    Interlocked.Increment(ref counter); 
} 

int GetCounter() 
{ 
    return Interlocked.Read(ref counter); 
} 

對於從GUI中使用,您可以將計數器更改傳播到適當的DependencyProperty(如果您使用的是WPF)。

對於第二部分,爲什麼不能分別計算每個記錄的時間戳,以便您不需要在線程之間共享任何內容?也許我沒有正確理解你的問題,你能否更詳細地描述問題#2?

+0

謝謝,因爲問題N1 Interlocked.Increment正是我​​需要的。第二個問題是,我可以(一般來說)用時間戳創建記錄數組,但它很大,並且(如果可能)我想檢查時間戳流的生成。生成規則非常簡單:只需爲每個後續記錄提前一個特定時間間隔的時間戳。 – BreakPhreak 2010-10-17 12:01:57

+0

@BreakPhreak:對於第二個問題,我仍然不明白;也許你可以在單線程的情況下發布你想要的代碼嗎? – Vlad 2010-10-17 12:09:41

+0

record.setTimestamp(timestamp = timestamp.AddSeconds(1));但實際上感謝 - 我剛剛爲第二部分提出了配方解決方案。 – BreakPhreak 2010-10-17 12:19:30

0

你並不需要做的是,在一個單獨的線程,你只需要確保只有一次一個線程執行它:

public class Synchoniser { 

    private int _progress; 
    private int _total; 
    private int _counter; 
    pricate object _sync; 

    public Synchroniser(int total, int counterSeed) { 
    _progress = 0; 
    _total = total; 
    _counter = counterSeed; 
    _sync = new Object(); 
    } 

    public void AdvanceProgress() { 
    lock (_sync) { 
     _progress++; 
    } 
    } 

    public int GetProgress() { 
    lock (_sync) { 
     return 100 * _progress/_total; 
    } 
    } 

    public int GetNextCounter() { 
    lock (_sync) { 
     _counter++; 
     return _counter; 
    } 
    } 

} 

創建類的一個實例,並給它到每個線程。現在他們每個人都可以推進進度並獲得下一個計數器值。

+0

都很棒,但N2的概率仍然存在:我可以爲同步器添加一個時間戳字段,並在每次推進進度時抓取它。這是你的意思,還是有更好的方法來處理這個問題? – BreakPhreak 2010-10-17 12:03:43