私はC++のオブジェクトでmutexを使う方法を理解しようとしています。オブジェクトとのmutexes
struct Rope{
int n, steps, offset;
//std::mutex mut;
Rope() {}
Rope(int n, int steps, int offset) : n(n), steps(steps), offset(offset) {}
void compute(){
double a[n];
for (int i=0; i<n; i++)
a[i] = i + offset;
for (int step=0; step<steps; step++)
for (int i=0; i<n; i++)
a[i] = sin(a[i]);
}
};
void runTest(){
int numRuns = 30;
int n = 10000;
int steps = 10000;
std::vector<Rope> ropes;
std::vector<std::thread> threads;
for (int i=0; i<numRuns; i++)
ropes.push_back(Rope(n, steps, i));
for (auto& r : ropes)
threads.push_back(std::thread(&Rope::compute, r));
for (std::thread& t : threads)
t.join();
}
コードがあるとして正常に動作し、私の4コアマシン上〜4倍のスピードアップを見ている:私はスピードテストとして使用しています以下の(ささい)マルチスレッドコードを持っています。私はもちろん、ロープに何も格納していないので、ミューテックスの必要はありません。私が保護する必要があるデータがあると仮定した場合、Ropeにmutexを付けて(例えば)compute()ループ内のstd :: lock_guardを呼び出したいと思います。しかし、ミューテックスのコメントを外すと、割り当てやコピーの演算子に「削除された関数の使用」に関するコンパイラエラーが発生します。オブジェクトを安全にロックする目的で私は何が欠けていますか?
@MikeSeymour彼が話していることを誤解していない限り、彼はすべてのスレッドで**同じ**ミューテックスを使用する必要があります。移動セマンティクスを使用してコンテナに配置することは機能しません。 (一方で、現在書かれているように、各スレッドは独自の 'Rope'オブジェクトを取得するので、ミューテックスは必要ありません。問題が明確に説明されていないときに、正しい解決策が何であるかを言うのは難しいです。) –
@ Mike Seymour: 'std :: mutex'は動かない。 'Rope'はデフォルトで' Rope'コンストラクタの 'std :: mutex'を構築することで移動またはコピー可能にすることができます。または、ジェームズが示唆するようにミューテックスを静的にすることによって、どちらのアプローチが適切かは、現時点でOPだけが知っているものです。 –
私の間違い;私は投稿する前に私の前提をチェックしておくべきだった。 –