锁定std :: map C ++

时间:2012-07-08 12:46:56

标签: c++ multithreading synchronization

我在多线程应用程序中使用std:map时遇到问题。我需要在线程写入此对象时锁定映射对象。另外,读取此对象的另一个线程应该一直存在,直到完成写入过程。

示例代码:

std::map<int, int> ClientTable;

int write_function() //<-- only one thread uses this function
{
  while(true)
  {
    //lock ClientTable
    ClientTable.insert(std::pair<int, int>(1, 2)); // random values
    //unlock ClientTable

    //thread sleeps for 2 secs
  }
}

int read_function()  //<--- many thread uses this function
{
  while(true)
  {
     int test = ClientTable[2]; // just for test
  }
}

如何锁定此std :: map对象并正确同步此线程?

2 个答案:

答案 0 :(得分:1)

看起来你需要的是一个典型的读写锁,允许任意数量的读者,但只有一个编写者。你可以看一下boost shared_mutex

可在此处找到其他用法示例:Example for boost shared_mutex (multiple reads/one write)?

答案 1 :(得分:0)

好吧,因为std :: map没有内置锁,所以你必须使用一个单独的锁来保护地图。如果地图完全受到该锁的保护,你可以将map子类化为在那里添加锁定以及“锁定”和“解锁”调用,但是如果锁也将用于其他项目那么它可能不是最好的想法那样做。

至于“如何正确同步” - 这非常特定于手头的应用程序。但是,对于给出的示例,您还必须在读取操作周围插入锁定/解锁调用。

如果你有读/写锁,这也可能是其中之一的一个很好的应用程序。