2016-06-09 14 views
0

Wenn ichLevelDB writebatch Concurrency Problem

using (WriteBatch batch = new WriteBatch()) 
{ 
    for(int i=0; i<100; i++) 
    { 
     batch.Put(i.ToString(), i.ToString()) 
    } 
    leveld_db.Write(batch); 
} 

von einem Thread und

using (WriteBatch batch = new WriteBatch()) 
{ 
    for(int i=0; i<100; i++) 
    { 
     batch.Put(i.ToString(), (i+1000).ToString()) 
    } 
    leveld_db.Write(batch); 
} 

von einem anderen Thread gleichzeitig haben, ist es eine Garantie, dass ich nicht mit Daten wie {10, 10} {11, 1011} enden?

Antwort

1

Nehmen wir an, Sie wundern sich über den thread-sicheren WriteBatch-Vorgang in leveldb.
Die Antwort ist ja, diese Operation ist Thread-sicher. In der Tat, Implementiert jede Operation in LevelDB verwendet WriteBatch:

Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) { 
    WriteBatch batch; 
    batch.Put(key, value); 
    return Write(opt, &batch); 
} 

und die Schreib ops Warteschlange gestellt wird Renn zu vermeiden:

writers_.push_back(&w); 
    while (!w.done && &w != writers_.front()) { 
    w.cv.Wait(); 
    } 
    if (w.done) { 
    return w.status; 
    }