Lockless Task Scheduler  v1.0a
A lockless task scheduler
lockfreebatchdispenser.h
1 // ***********************************************************************
2 // <copyright file="lockfreebatchdispenser.h" >
3 // Copyright (c) viknash. All rights reserved.
4 // </copyright>
5 // <summary></summary>
6 // ***********************************************************************
7 #pragma once
8 
9 
10 namespace task_scheduler {
11 
16  template < typename T, class TDataType, class TMemInterface >
17  class lock_free_batch_dispatcher : public TMemInterface
18  {
19  public:
24  lock_free_batch_dispatcher(TDataType &_data_type);
35  T *get_next_batch(size_t _requested_batch_size, size_t &_returned_batch_size);
36 
37  private:
41  TDataType &data;
45  T *locked_data;
49  std::atomic< size_t > next_batch_index;
50  };
51 
52 
53  template < typename T, class TDataType, class TMemInterface >
55  TDataType &_guarded_data_structure)
56  : data(_guarded_data_structure)
57  , locked_data(nullptr)
58  , next_batch_index(0)
59  {
60  data.lock(locked_data);
61  }
62 
63 
64  template < typename T, class TDataType, class TMemInterface >
66  {
67  data.unlock(locked_data);
68  ts_debug_only(next_batch_index = 0;);
69  }
70 
71 
72  template < typename T, class TDataType, class TMemInterface >
74  size_t &_returned_batch_size)
75  {
76  assert(locked_data); // Data has been accessed without locking
77  size_t current_batch_index = next_batch_index.fetch_add(_requested_batch_size);
78  size_t array_size = data.size();
79  if (current_batch_index < array_size)
80  {
81  _returned_batch_size = std::min(array_size - current_batch_index, _requested_batch_size);
82  return locked_data + current_batch_index;
83  }
84  else
85  {
86  _returned_batch_size = 0;
87  return nullptr;
88  }
89  }
90 }
lock_free_batch_dispatcher(TDataType &_data_type)
Initializes a new instance of the lock_free_batch_dispatcher class.
Definition: lockfreebatchdispenser.h:54
Class stl_allocator.
Definition: allocator.h:16
T * get_next_batch(size_t _requested_batch_size, size_t &_returned_batch_size)
Gets the next batch.
Definition: lockfreebatchdispenser.h:73
Class lock_free_batch_dispatcher.
Definition: lockfreebatchdispenser.h:17
~lock_free_batch_dispatcher()
Finalizes an instance of the lock_free_batch_dispatcher class.
Definition: lockfreebatchdispenser.h:65