私はバリアクラスの実装を試みました。私は分裂と征服のアルゴリズムを使用してこれをテストしたい。私のクラスは以下のように定義されます。分割するようdivideとconquer(バリアントがビジー状態で破壊されている)のバリヤークラスC++
class barrier{
private:
mutex mtx;
condition_variable cv;
atomic<int> counter;
atomic<int> waiting;
atomic<int> thread_count;
public:
barrier(int count) : thread_count(count), counter(0), waiting(0) {}
void wait()
{
//fence mechanism
unique_lock<mutex> lock(mtx);
++counter;
++waiting;
cv.wait(lock, [&] {return counter >= thread_count; });
--waiting;
if (waiting == 0) counter = 0;
for (int i = 0; i < thread_count; ++i) cv.notify_one();
lock.unlock();
}
};
とアルゴリズムを征服次のように、私はそれを実装しました:
int main() {
vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
int n = size(v)/2;
while (n >= 1) {
dnc_light(v, n);
n /= 2;
}
return 0;
}
void dnc_light (vector<int> &v, int n) {
thread trd[50];
barrier bar(n);
for (int i = 0; i < n; ++i) {
trd[i] = thread([&] {
v[i] += v[i + n];
bar.wait();
});
}
}
「忙しいながら、破壊されたミューテックス」このしかし結果 - エラー。どうして?私はbarrier bar(...)
のサイズを動的に処理する必要があります。
私はちょうどそれをテストし、あなたの提案が動作します。私は2つの質問があります:それらを結合するのではなく、 'dnc_light'のスレッドをデタッチできますか?昨日、主な機能のすべてをコーディングしようとしましたが、同じエラーが発生しました。なぜなら、for-loopの後にバリアが破棄されたからです。 – SAFD
@SAFDスレッドに参加する必要がないようにスレッドを切り離すことができます。ただし、その場合は、障壁が生きていることを確認する必要があります。これを行うための1つの方法は、 'auto barrier = make_shared(n);'であり、 'barrier'スマートポインタを値に渡してスレッドに渡すので、使用中は生きています。 –
さて、それは私にとってはあまりにも複雑です、私は恐れています。 私が気づいたいくつかのさらなるテストの後で、合計は必ずしも136ではないことがあります。スレッドが計算を混乱させることがあります。 したがって、私は 'dnc_light'を変更しました:' v'' byvalを捕まえ、 '' temp''を持って合計を保存します。これにより、いくつかの問題が解決されました。私が今得する唯一のエラーは、いくつかのランダムな合計が「0」になるということです。 – SAFD