私は整数をアトミックにインクリメントする方法を検討していましたが、ではなく、バインドチェックでとなりました。 私は他の投稿を見回しましたが、どれも良い解決策は見当たりません(そしていくつかはプレC++ 11です)。私は必要なものアトミックで彩度を調整する
は、次のようなライブラリです:のように使用する
class bounded_atomic_uint
{
private:
uint32_t ctr;
uint32_t max;
mutex mtx;
public:
bounded_atomic_uint(uint32_t max = UINT32_MAX) : ctr(0), max(max) {}
~bounded_atomic_uint() = default;
// make in uncopyable and un-movable
bounded_atomic_uint(bounded_atomic_uint&&) = delete;
bounded_atomic_uint& operator=(bounded_atomic_uint&&) = delete;
bool inc();
bool dec();
uint32_t get();
};
bool bounded_atomic_uint::inc() {
lock_guard<mutex> lck (mtx);
if (ctr < max) {
ctr++;
return true;
}
else
{
cout << "max reached (" << max << ")" << endl; // to be removed!
return false; // reached max value
}
}
bool bounded_atomic_uint::dec() {
lock_guard<mutex> lck (mtx);
if (ctr > 0) {
ctr--;
return true;
}
else {
cout << "min reached (0)" << endl; // to be removed!
return false; // reached min value
}
}
uint32_t bounded_atomic_uint::get() {
lock_guard<mutex> lck (mtx);
return ctr;
}
:
#include <iostream>
#include <mutex>
#include <cstdint>
using namespace std;
int main() {
bounded_atomic_uint val(3);
if (val.dec())
cout << "error: dec from 0 succeeded !!" << endl;
cout << val.get() << endl; // make sure it prints 0
val.inc();
val.inc();
cout << val.get() << endl;
if (!val.inc())
cout << "error: havent reached max but failed!!" << endl;
if (val.inc())
cout << "error max not detected!!" << endl;
cout << val.get() << endl;
return 0;
}
は、これを行うのいずれかの簡単な方法(またはより正確には)ありませんか? std :: atomicもboost :: atomicも、アウト・バウンド・チェック(ロック内)を回避する方法を持たないようです。
これがなければ、は簡潔クラスは十分ですか? ここに何もないのですか?ライブラリのcoutsが本当の使用に削除されることを
注意!
FYIあなたが探している用語は、「飽和演算」です。 –