は、ここで私はちょうどなど「SwitchableBarrier」と「CountingSection」のようなクラスの束を作るつもりだったが、その後、私は「SwitchableCountingSectionのような組み合わせを必要とし始めた当初は、私のスレッドバリア/セクションタイプのもの一部の変数テンプレートを特定にすることはできますか?
template <bool switchable = false, bool counting = false>
struct SimpleBarrier {
private:
std::mutex mtx;
std::condition_variable cv;
std::atomic<bool> enabled;
std::atomic<int> inside;
public:
SimpleBarrier() {
if (switchable) enabled.store(true, std::memory_order_release);
if (counting) inside.store(0, std::memory_order_release);
}
void enter() {
if (switchable && !enabled.load(std::memory_order_acquire)) return;
if (counting) inside.fetch_add(1, std::memory_order_acq_rel);
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock);
}
void leave() {
if (counting) inside.fetch_sub(1, std::memory_order_acq_rel);
}
void release() {
cv.notify_all();
}
void enable() {
if (switchable) {
enabled.store(true, std::memory_order_release);
}
}
void disable() {
if (switchable) {
enabled.store(false, std::memory_order_release);
}
}
bool is_empty() {
if (counting) return inside.load(std::memory_order_acquire) == 0;
return false;
}
};
ですおそらく十数クラスを作ることを避けるために、より質の高いものになるでしょう。テンプレートパラメータを使用してそれらを1つのクラスにロールして、特定の品質をオン/オフにします。
テンプレートパラメータを条件として使用すると、コンパイラは未使用の品質を最適化して、未使用のものから余分なオーバーヘッドを取り除くことができます。問題は、クラス変数を最適化することも可能ですか?
たとえば、変数が "内側"の場合、カウント== falseの場合、完全に役に立たず、そこにいる必要はありません。テンプレートパラメータ固有のクラス変数を持つことはできますか?
'counting == false'のテンプレート特殊化を定義しますか? – songyuanyao