å—到this codeçš„å¯å‘,我æ£åœ¨å°è¯•å®žçŽ°ä¸€ä¸ªèƒ½å¤Ÿé€šè¿‡çº¿ç¨‹å®‰å…¨åœ°åŒæ—¶è°ƒç”¨vector
的读者/编写器push_back()
。
一旦这个类到ä½ï¼Œæˆ‘å¯ä»¥é€šè¿‡è°ƒç”¨erase()
创建方法std::swap()
,它交æ¢ç›®æ ‡é¡¹å’Œæœ€åŽä¸€é¡¹ï¼Œç„¶åŽåˆ 除集åˆä¸çš„最åŽä¸€é¡¹ã€‚通过这ç§æ–¹å¼ï¼Œæˆ‘å‡è®¾æ€§èƒ½åº”è¯¥æ˜¯å…¬å¹³çš„ï¼Œå› ä¸ºåˆ é™¤é›†åˆä¸é—´çš„项目ä¸ä¼šè°ƒç”¨ç§»åŠ¨é›†åˆä¸ç›®æ ‡é¡¹ç›®ä¹‹åŽçš„所有项目。
ä¸å¹¸çš„是,以下代ç :
#include <vector>
#include <boost/thread/shared_mutex.hpp> //shared_mutex
#include <memory> //shared_ptr
#include <utility> //swap()
template <class T>
class readers_writer_vector
{
std::shared_ptr<boost::shared_mutex> pm;
std::vector<T> data;
public:
readers_writer_vector() :
pm(new std::shared_ptr<boost::shared_mutex>){}
void push_back(const T& item){
boost::unique_lock<boost::shared_mutex> lock(*pm); //wrong design
data.push_back(item);
}
};
int main()
{
readers_writer_vector<int> db;
db.push_back(1);
return 0;
}
产生以下编译错误:
/usr/include/c++/4.9/bits/shared_ptr_base.h:871:39: error: cannot convert ‘std::shared_ptr<boost::shared_mutex>*’ to ‘boost::shared_mutex*’ in initialization
: _M_ptr(__p), _M_refcount(__p)
// g++ -std=c++11 -Iboost -lboost t.cpp
我该如何解决?请ï¼
修改
执行任务比我想象的è¦å¤æ‚得多。在我é‡åˆ°@Danhè¦å‘Šçš„问题之å‰æ²¡å¤šä¹…。现在我收到了这些错误:
t.cpp:28:8: note: ‘i::i(const i&)’ is implicitly deleted because the default definition would be ill-formed:
struct i {
^
t.cpp:28:8: error: use of deleted function ‘readers_writer_vector<T>::readers_writer_vector(const readers_writer_vector<T>&) [with T = z]’
t.cpp:13:2: note: declared here
readers_writer_vector(readers_writer_vector const&) = delete;
使用æ¤ç‰ˆæœ¬ï¼š
template <class T>
class readers_writer_vector
{
booster::shared_mutex m;
std::vector<T> data;
public:
readers_writer_vector() = default;
readers_writer_vector(readers_writer_vector const&) = delete;
void push_back(const T& item){
booster::unique_lock<booster::shared_mutex> lock(m);
data.push_back(item);
}
typename std::vector<T>::reference back(){
return data.back();
}
};
struct z {
int zipcode;
std::string address;
};
struct i {
int id;
readers_writer_vector<z> zipcodes;
};
int main()
{
readers_writer_vector<i> db;
db.push_back(i());
auto &ii=db.back();
ii.id=1;
ii.zipcodes.push_back(z());
auto &zz=ii.zipcodes.back();
zz.zipcode=11;
zz.address="aa";
return 0;
}
除了修å¤çŽ°æœ‰é”™è¯¯ä¹‹å¤–,我还必须为readers_writer_vector
实现è¿ä»£å™¨ï¼Œä»¥ä½¿è¯¥ç±»æœ‰ç”¨ã€‚
我在æ€è€ƒæ˜¯å¦åº”该继ç»......
ç”案 0 :(得分:3)
å› ä¸ºpm
std::shared_ptr<boost::shared_mutex>
ä¸æ˜¯std::shared_ptr<boost::shared_mutex>*
ã€‚ä½ å¯ä»¥ç”¨è¿™ä¸ªï¼š
readers_writer_vector() :
pm(std::make_shared<boost::shared_mutex>()){}
æ— è®ºå¦‚ä½•ï¼Œä½ ä¸ºä»€ä¹ˆéœ€è¦æŒ‡é’ˆ/智能指针?这更适åˆï¼š
template <class T>
class readers_writer_vector
{
boost::shared_mutex pm;
std::vector<T> data;
public:
void push_back(const T& item){
boost::unique_lock<boost::shared_mutex> lock(pm);
data.push_back(item);
}
};
ç”案 1 :(得分:1)
您æ£åœ¨ä½¿ç”¨é”™è¯¯çš„类型åˆå§‹åŒ–pm
;ä½ å®žé™…ä¸Šæœ‰
std::shared_ptr<> pm = new std::shared_ptr<>;
æ‚¨æ— æ³•ä»ŽæŒ‡å‘共享指针的指针分é…共享指针。
用
替æ¢åˆå§‹åŒ–程åºpm(new boost::shared_mutex)
或直接使互斥é”æˆä¸ºæˆå‘˜ï¼Œè€Œä¸æ˜¯ä½¿ç”¨å…±äº«æŒ‡é’ˆã€‚