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 <vector>
12
13#include <boost/thread.hpp>
14
15
16// テンプレートの実装はヘッダーに書く.
17// https://qiita.com/i153/items/38f9688a9c80b2cb7da7 (アクセス日 2023/12/25)
18
19
20namespace designlab
21{
22
23template <typename T> concept CopyAssignable = std::is_copy_assignable<T>::value;
24
53template <CopyAssignable T>
54class AsyncableData final
55{
56public:
57 AsyncableData() : update_count_(0) {}
58 explicit AsyncableData(const T& data) : data_(data), update_count_(0) {}
59
60 AsyncableData(const AsyncableData&) = delete;
63
68 T GetData() const
69 {
70 // 読み取り用のロックをかける.
71 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
72 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
73 return data_;
74 };
75
80 void SetData(const T& data)
81 {
82 // 書き込み用のロックをかける.
83 // まずは,upgrade_lock を用意して,それを unique_lock に変更する.
84 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
85
86 {
87 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
88
89 data_ = data;
90 ++update_count_;
91 }
92 };
93
99 int GetUpdateCount() const
100 {
101 // 読み取り用のロックをかける.
102 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
103 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
104 return update_count_;
105 };
106
107private:
108 mutable boost::shared_mutex mtx_;
109
110 T data_;
111
112 int update_count_;
113};
114
115
116
123template <typename T>
124class AsyncableData <std::vector<T> > final
125{
126public:
127 AsyncableData() : data_({}), update_count_(0) {}
128 explicit AsyncableData(const std::vector<T>& data) :
129 data_(data),
130 update_count_(0) {}
131
133 AsyncableData(const AsyncableData&) = delete;
134
137
140
145 std::vector<T> GetData() const
146 {
147 // 読み取り用のロックをかける.
148 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
149 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
150 return data_;
151 };
152
157 void SetData(const std::vector<T>& data)
158 {
159 // 書き込み用のロックをかける.まずは,upgrade_lockを用意して,
160 // それを unique_lock に変更する.
161 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
162
163 {
164 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
165
166 data_ = data;
167 ++update_count_;
168 }
169 };
170
175 void PushBack(const T& data)
176 {
177 // 書き込み用のロックをかける.
178 // まずは,upgrade_lock を用意して,それを unique_lock に変更する.
179 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
180
181 {
182 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
183
184 data_.push_back(data);
185 ++update_count_;
186 }
187 };
188
192 void Clean()
193 {
194 // 書き込み用のロックをかける.
195 // まずは,upgrade_lock を用意して,それを unique_lock に変更する.
196 boost::upgrade_lock<boost::shared_mutex> upgrade_lock(mtx_);
197
198 {
199 boost::upgrade_to_unique_lock<boost::shared_mutex> write_lock(upgrade_lock);
200
201 data_.clear();
202 ++update_count_;
203 }
204 };
205
209 size_t GetSize() const
210 {
211 // 読み取り用のロックをかける.
212 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
213 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
214 return data_.size();
215 };
216
222 int GetUpdateCount() const
223 {
224 // 読み取り用のロックをかける.
225 // このスコープ { } を抜けるまでロックがかかる.(つまりこの関数が終わるまで)
226 boost::shared_lock<boost::shared_mutex> read_lock(mtx_);
227 return update_count_;
228 };
229
230private:
231 mutable boost::shared_mutex mtx_;
232
233 std::vector<T> data_;
234
235 int update_count_;
236};
237
238} // namespace designlab
239
240
241#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:24