2016-06-09 2 views
0

Если у меня естьLevelDB writebatch параллелизм вопрос

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

из одного потока и

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

из другого параллельного потока, есть гарантия того, что я не в конечном итоге с данными, как {10, 10} {11, 1011}?

ответ

1

Предположим, что вам интересно использовать потокобезопасную операцию WriteBatch в leveldb.
Ответ да, эта операция является потокобезопасной. На самом деле, каждая операция в LevelDB реализуется с помощью WriteBatch:

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

И опам записи в очередь, чтобы избежать гонки:

writers_.push_back(&w); 
    while (!w.done && &w != writers_.front()) { 
    w.cv.Wait(); 
    } 
    if (w.done) { 
    return w.status; 
    } 
Смежные вопросы