How do I use an arbitrary string as a lock in C++?

前端 未结 6 1886
半阙折子戏
半阙折子戏 2021-02-04 15:15

Let\'s say I have a multithreaded C++ program that handles requests in the form of a function call to handleRequest(string key). Each call to handleRequest

6条回答
  •  盖世英雄少女心
    2021-02-04 15:37

          /**
          * StringLock class for string based locking mechanism
          * e.g. usage
          *     StringLock strLock;
          *     strLock.Lock("row1");
          *     strLock.UnLock("row1");
          */
          class StringLock    {
          public:
              /**
               * Constructor
               * Initializes the mutexes
               */
              StringLock()    {
                  pthread_mutex_init(&mtxGlobal, NULL);
              }
              /**
               * Lock Function
               * The thread will return immediately if the string is not locked
               * The thread will wait if the string is locked until it gets a turn
               * @param string the string to lock
               */
              void Lock(string lockString)    {
                  pthread_mutex_lock(&mtxGlobal);
                  TListIds *listId = NULL;
                  TWaiter *wtr = new TWaiter;
                  wtr->evPtr = NULL;
                  wtr->threadId = pthread_self();
                  if (lockMap.find(lockString) == lockMap.end())    {
                      listId = new TListIds();
                      listId->insert(listId->end(), wtr);
                      lockMap[lockString] = listId;
                      pthread_mutex_unlock(&mtxGlobal);
                  } else    {
                      wtr->evPtr = new Event(false);
                      listId = lockMap[lockString];
                      listId->insert(listId->end(), wtr);
                      pthread_mutex_unlock(&mtxGlobal);
                      wtr->evPtr->Wait();
                  }
              }
              /**
              * UnLock Function
              * @param string the string to unlock
              */
              void UnLock(string lockString)    {
                  pthread_mutex_lock(&mtxGlobal);
                  TListIds *listID = NULL;
                  if (lockMap.find(lockString) != lockMap.end())    {
                      lockMap[lockString]->pop_front();
                      listID = lockMap[lockString];
                      if (!(listID->empty()))    {
                          TWaiter *wtr = listID->front();
                          Event *thdEvent = wtr->evPtr;
                          thdEvent->Signal();
                      } else    {
                          lockMap.erase(lockString);
                          delete listID;
                      }
                  }
                  pthread_mutex_unlock(&mtxGlobal);
              }
          protected:
              struct TWaiter    {
                  Event *evPtr;
                  long threadId;
              };
              StringLock(StringLock &);
              void operator=(StringLock&);
              typedef list TListIds;
              typedef map TMapLockHolders;
              typedef map TMapLockWaiters;
          private:
              pthread_mutex_t mtxGlobal;
              TMapLockWaiters lockMap;
          };
    

提交回复
热议问题