GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
asyncable_data.h
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
8#ifndef DESIGNLAB_ASYNCABLE_DATA_H_
9#define DESIGNLAB_ASYNCABLE_DATA_H_
10
11#include <boost/thread.hpp>
12#include <vector>
13
14namespace designlab {
15
16template <typename T>
17concept CopyAssignable = std::is_copy_assignable<T>::value;
18
47template <CopyAssignable T>
48class AsyncableData final {
49 public:
50 AsyncableData() : update_count_(0) {}
51 explicit AsyncableData(const T& data) : data_(data), update_count_(0) {}
52
53 AsyncableData(const AsyncableData&) = delete;
55 delete;
57
62 T GetData() const {
63 // 読み取り用のロックをかける.
64 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
65 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
66 return data_;
67 };
68
73 void SetData(const T& data) {
74 // 書き込み用のロックをかける.
75 // まずは,upgrade_lock を用意して,それを unique_lock に変更する.
76 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
77
78 {
79 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(
80 upgrade_lock);
81
82 data_ = data;
83 ++update_count_;
84 }
85 };
86
92 int GetUpdateCount() const {
93 // 読み取り用のロックをかける.
94 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
95 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
96 return update_count_;
97 };
98
99 private:
100 mutable boost::shared_mutex mtx_;
101
102 T data_;
103
104 int update_count_;
105};
106
113template <typename T>
114class AsyncableData<std::vector<T> > final {
115 public:
116 AsyncableData() : data_({}), update_count_(0) {}
117 explicit AsyncableData(const std::vector<T>& data)
118 : data_(data), update_count_(0) {}
119
121 AsyncableData(const AsyncableData&) = delete;
122
125
128
133 std::vector<T> GetData() const {
134 // 読み取り用のロックをかける.
135 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
136 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
137 return data_;
138 };
139
144 void SetData(const std::vector<T>& data) {
145 // 書き込み用のロックをかける.まずは,upgrade_lockを用意して,
146 // それを unique_lock に変更する.
147 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
148
149 {
150 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(
151 upgrade_lock);
152
153 data_ = data;
154 ++update_count_;
155 }
156 };
157
162 void PushBack(const T& data) {
163 // 書き込み用のロックをかける.
164 // まずは,upgrade_lock を用意して,それを unique_lock に変更する.
165 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
166
167 {
168 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(
169 upgrade_lock);
170
171 data_.push_back(data);
172 ++update_count_;
173 }
174 };
175
179 void Clean() {
180 // 書き込み用のロックをかける.
181 // まずは,upgrade_lock を用意して,それを unique_lock に変更する.
182 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
183
184 {
185 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(
186 upgrade_lock);
187
188 data_.clear();
189 ++update_count_;
190 }
191 };
192
196 size_t GetSize() const {
197 // 読み取り用のロックをかける.
198 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
199 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
200 return data_.size();
201 };
202
208 int GetUpdateCount() const {
209 // 読み取り用のロックをかける.
210 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
211 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
212 return update_count_;
213 };
214
215 private:
216 mutable boost::shared_mutex mtx_;
217
218 std::vector<T> data_;
219
220 int update_count_;
221};
222
223} // namespace designlab
224
225#endif // DESIGNLAB_ASYNCABLE_DATA_H_
AsyncableData & operator=(const AsyncableData &)=delete
コピー代入は禁止.
void SetData(const std::vector< T > &data)
値を変更する. この時,write lockをかける. データの更新回数をインクリメントする.
AsyncableData(const AsyncableData &)=delete
コピーは禁止.
size_t GetSize() const
sizeを返す.要素の数を size_tで返す. この時,read lockをかける.
int GetUpdateCount() const
データの更新回数を返す. この時,read lockをかける. この値を調べて,データの更新回数が変わっているかを確認することで, データの更新が必要かを確認する.
void Clean()
値をすべて削除する. この時,write lockをかける. データの更新回数をインクリメントする.
std::vector< T > GetData() const
値をコピーして返す. この時,read lockをかける. 当然,データの更新回数はインクリメントされない.
AsyncableData(const std::vector< T > &data)
void PushBack(const T &data)
最後尾に値を追加する. この時,write lockをかける. データの更新回数をインクリメントする.
AsyncableData(AsyncableData &&)=delete
ムーブは禁止.
非同期処理を行う際に,データの更新回数とデータをまとめて扱うためのクラス.
AsyncableData(const T &data)
int GetUpdateCount() const
データの更新回数を返す. この時,read lockをかける. この値を調べて,データの更新回数が変わっているかを確認することで, データの更新が必要かを確認する.
void SetData(const T &data)
値を変更する. この時,write lockをかける. データの更新回数をインクリメントする.
T GetData() const
値をコピーして返す. この時,read lockをかける. 当然,データの更新回数はインクリメントされない.
AsyncableData(AsyncableData &&)=delete
ムーブは禁止
AsyncableData(const AsyncableData &)=delete
コピーは禁止
AsyncableData & operator=(const AsyncableData &)=delete
コピー代入は禁止
Definition com_type.h:21