私はかなりシンプルなデザインだと思っています。複数のオブジェクトがあり、それぞれにstd :: mapが含まれており、アクセスするプロセスが複数あります。私は一度にこれらのマップのそれぞれに1つの挿入/消去だけがあることを確認したいと思います。クラスメンバーのmutexアサーションが失敗しました
私はboost :: threadとclass member mutexesについて読んでいます。そしてbindを使ってクラスメンバーに渡しました。これは私にはすべて新しいものです。私はa Dr. Dobbs articleの簡単な例題から始め、それを修正しようとしました。スレッド化されたオブジェクトがコピー不可能でなければならないため、あらゆる種類のコンパイラエラーが発生していました。それを読んだら、代わりにミューテックスへのポインタを保持することで面倒を避けることができると決めました。だから今、私は次のエラーで結果に過ぎずコンパイルしたコードを持っている:
/usr/include/boost/shared_ptr.hpp:419:
T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const
[with T = boost::mutex]: Assertion `px != 0' failed. Abort
は、今私は本当にこだわっていると、本当にコードだけでなく、私が間違って概念的に行くよどこにコメントを助けいただければ幸いです。私はこれらの問題の周りにいくつか答えられた質問が既にあることを知っていますが、私はまだ何かが欠けていると思います。
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <map>
using namespace std;
class Threaded {
public:
std::map<int,int> _tsMap;
void count(int id) {
for (int i = 0; i < 100; ++i) {
_mx->lock();
//std::cout << id << ": " << i << std::endl;
_tsMap[i] ++;
_mx->unlock();
}
}
private:
boost::shared_ptr<boost::mutex> _mx;
};
int main(int argc, char* argv[]) {
Threaded th;
int i = 1;
boost::thread thrd1(boost::bind(&Threaded::count, &th, 1));
//boost::thread thrd2(boost::bind(&th.count, 2));
thrd1.join();
//thrd2.join();
return 0;
}
うーん、それは私の馬鹿だった。問題を解決し、コードが適切に動作しているように見えます。今、このアプローチは間違っていますか?以下のravenspointの答えに従って、クラスの外側にミューテックスを格納する方が好きなのはなぜですか?これははるかに便利で論理的です – confusedCoder