代码之家  ›  专栏  ›  技术社区  ›  Fanatic23

搜索并发链表

  •  0
  • Fanatic23  · 技术社区  · 14 年前

    我有一个并发的链接列表。我需要对这个列表中的查找进行优先级排序,因此如果一个线程开始在列表上迭代,并且随后的插入/删除请求出现,我会将这些请求排队,但是如果有来自其他线程的查找请求,我会让它们发生。实施这种情况的最佳方法是什么?

    编辑:我不想复制这份名单。太贵了。妈妈付我的硬件费。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Björn Pollex    14 年前

    听起来你在找 readers-/writer-lock . 这是一个锁,可用于让许多线程读取数据结构,但当一个线程具有写访问权限时,所有其他线程都被锁定。

    Boost提供了 implementation .

        2
  •  0
  •   bjskishore123    14 年前

    你在窗户上吗? 如果是,则可以使用事件或互斥对象等同步对象。

    对于insert和delete,可以在这些函数的开头锁定互斥锁,在函数的结尾释放互斥锁。

    步骤如下。

    1. 创建事件对象。 http://msdn.microsoft.com/en-us/library/ms682655(VS.85).aspx

    2. 在insert/delete函数的开头使用WaitForSingleObject函数锁定事件obect。 http://msdn.microsoft.com/en-us/library/ms687032(VS.85).aspx

    3. 使用SetEvent在insert/delete函数结束时解除对事件对象的锁定,以便等待此事件对象的线程可以轮到执行插入/删除操作。 http://msdn.microsoft.com/en-us/library/ms686211(VS.85).aspx

    读取不需要获取锁。所以不需要事件或互斥来读取。多个线程可以从共享缓冲区并发读取。

    你可以在 http://en.wikipedia.org/wiki/Readers-writer_lock

    你可以在 http://msdn.microsoft.com/en-us/library/ms686915(v=VS.85).aspx

        3
  •  0
  •   Jonathan    14 年前

    听起来像是一个香草读者作家锁不完全是你想要的。一旦您尝试获取锁的writer端,其他读卡器将阻塞,直到writer完成,而您说您希望执行读操作的其他线程获得访问权限,即使存在挂起的插入。

    我不确定你想要的是不是安全。如果正在进行足够的读取,则插入/删除可能会永远阻塞。

    如果你真的想这样做,你可以很容易地自己构建它,就像你可以很容易地在标准互斥锁之上构建一个读写锁一样。

    请注意,这段代码可能已损坏,但可能会给您一个大致的概念。

    class UnfairReaderWriterMutex {
      Mutex mutex;
      CondVar condition;
      int readers;  // if positive, reader count; if -1, writer lock is held
     public:
      UnfairReaderWriterMutex() : counter(0) { }
      void ReaderLock() {
        mutex.Lock();
        while (counter < 0) {
          condition.Wait();
        }
        ++readers;
        mutex.Unlock();
      }
      void ReaderUnlock() {
        mutex.Lock();
        assert(readers > 0);
        --readers;
        condition.Notify();  // only need to wake up one writer
        mutex.Unlock();
      }
      void WriterLock() {
        mutex.Lock();
        while (counter > 0) {
          condition.Wait();
        }
        readers = -1;
        mutex.Unlock();
      }
      void WriterUnlock() {
        mutex.Lock();
        assert(readers == -1);
        readers = 0;
        condition.NotifyAll();  // there may be multiple readers waiting
        mutex.Unlock();
      }
    };
    

    一个典型的reader/writer锁的工作原理与此类似,只是有一个标志阻止读者在writer等待时获取锁。