1

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 对象并正确同步这个线程?

4

2 回答 2

2

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

可以在此处找到其他使用示例:boost shared_mutex (multiple reads/one write) 的示例?

于 2012-07-08T12:59:21.697 回答
0

好吧,由于 std::map 没有内置锁,因此您必须使用单独的锁来保护地图。如果映射是由该锁保护的所有内容,您可以将映射子类化以在其中添加锁以及“锁定”和“解锁”调用,但如果锁也将用于其他项目,那么它可能不是最好的主意去做。

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

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

于 2012-07-08T12:54:25.943 回答