projects:libcds:bounded_pool
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
projects:libcds:bounded_pool [2015/12/10 15:09] – [Bounded object pool] khizmax | projects:libcds:bounded_pool [2015/12/17 23:11] (current) – khizmax | ||
---|---|---|---|
Line 4: | Line 4: | ||
Раз алгоритм lock-free, то и пул тоже должен быть по крайней мере lock-free. | Раз алгоритм lock-free, то и пул тоже должен быть по крайней мере lock-free. | ||
Пул — это не очередь и не стек, хотя эти структуры данных могут быть пулом. Пул — это класс с двумя интерфейсными функциями: | Пул — это не очередь и не стек, хотя эти структуры данных могут быть пулом. Пул — это класс с двумя интерфейсными функциями: | ||
- | - '' | + | * '' |
- | - '' | + | |
Как правило, | Как правило, | ||
Line 20: | Line 20: | ||
В настоящее время (libcds 2.1.0) в качестве пула в библиотеке используется [[http:// | В настоящее время (libcds 2.1.0) в качестве пула в библиотеке используется [[http:// | ||
bounded очереди Дмитрия Вьюкова. | bounded очереди Дмитрия Вьюкова. | ||
- | Он быстр, но имеет один существенный недостаток — иногда | + | Он быстр, но имеет один существенный недостаток — он не является линеаризуемым: |
при почти полной очереди '' | при почти полной очереди '' | ||
То есть эта очередь не может стабильно работать в режиме «пул полон». | То есть эта очередь не может стабильно работать в режиме «пул полон». | ||
- | **Требуется**: реализовать быстрый | + | **UPD**: очередь Вьюкова сделана линеаризуемой. По крайней мере, нижеследующий |
- | < | + | **Требуется**: |
+ | |||
+ | < | ||
template < | template < | ||
class Pool | class Pool | ||
Line 41: | Line 43: | ||
}; | }; | ||
</ | </ | ||
+ | Методы '' | ||
**Критерий корректности**: | **Критерий корректности**: | ||
- | < | + | < |
Pool< | Pool< | ||
std:: | std:: | ||
std:: | std:: | ||
- | void thread() | + | void thread_func() |
{ | { | ||
for ( int i = 1; i <= 1000000; ++i ) { | for ( int i = 1; i <= 1000000; ++i ) { | ||
- | if ( !pool.push( i )) | + | if ( !pool.put( &i )) |
nPutError.fetch_add(1, | nPutError.fetch_add(1, | ||
- | void * p = pool.pop(); | + | void * p = pool.get(); |
if ( p == nullptr ) | if ( p == nullptr ) | ||
nGetError.fetch_add( 1, std:: | nGetError.fetch_add( 1, std:: |
projects/libcds/bounded_pool.1449749347.txt.gz · Last modified: 2015/12/10 15:09 by khizmax