Boost logo

Threads-Devel :

Subject: [Threads-devel] shared_lock() causes Segmentation Fault in CentOS 5.5 x64?
From: Zap (zippo.fire_at_[hidden])
Date: 2011-03-14 23:57:08


Dear Pals,

I wrote a server program, and there is a class called "apInfoMutex",
which can store client's file descriptor info and what messages they sent;
the class code is as below:

---
class apInfoTable{
   public:
      apInfoTable();
      boost::shared_mutex rwMutex;
      void   addFD(int apfd, char *srvceType, vector<string> *codeList);
      void   delFD(int apfd);
      bool   getFD(list<int> *des, char *srvceType, char *srvceCode);
  
   private:
      boost::unordered_map<int, boost::unordered_set<pair<string, string> > > 
tableFD;
      boost::unordered_map<pair<string, string>, boost::unordered_set<int> > 
tablePush;
};
---
there is just one apInfoTable as global declaration in my program,
but there would be two or more threads to calling these public 
method at the same time, and there is a method called "getFD()" in this class,
the code is as below:
---
bool apInfoTable::getFD(list<int> *des, char *type, char *code){
   bool flag=false;
   boost::shared_lock<boost::shared_mutex> lock(rwMutex);
   for(boost::unordered_set<int>::iterator it=tablePush[pair<string, string>
(type, code)].begin();it!=tablePush[pair<string, string>(type, code)].end
();it++){  
      flag=true;
      des->push_back(*it);
   }
   return flag;
}
---
I found if I calling getFD() method like this:
char type[12];
char code[32];
list<int> fdList;
memset(type, 0x00, sizeof(type));
memset(code, 0x00, sizeof(code));
memcpy(type, "My Type", sizeof("My Type"));
memcpy(code, "My Code", sizeof("My Code"));
fdList.clear();
bool rc=getFD(&fdList, type, code);
I will got "Segmentation Fault" problem,
but if I put different parameter like this:
bool rc=getFD(&fdList, "My Type", "My Code");
or using boost::mutex instead of shared_lock() and shared_mutex in getFD(),
there wouldn't be any problem when running program.
is there any problem with my code?
or did I use shared_lock() and shared_mutex incorrectly?
P.S--I tried using unique_lock or scoped_lock instead of shared_lock(),
but there is just no any problem when I using normal boost::mutex
sincerely thanks to you
Zap

Threads-Devel list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk