2012-07-08 84 views
0

我的多线程应用程序中使用std:map时出现问题。当线程写入此对象时,我需要锁定地图对象。同时读取该对象的另一个线程应该购物,直到写入过程完成。锁定std :: map C++

示例代码:

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 ::地图对象和正确同步此线程?

+1

你可能想改变'read_function'使用'map'的'find'成员函数,而不是'运营商[]',因为后者实际上可以修改'地图'。通常这是一个温和的烦恼(最坏的情况),但在这种情况下,变得更加严重。 – 2012-07-08 14:06:32

回答

0

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

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

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

+1

如果锁保护地图和其他相关对象,将地图,锁和其他相关对象捆绑到一个类中可能是一个好主意。该类可以提供一个函数,该函数在持有锁的同时调用映射的“插入”函数。 '运算符[]'同上(当然,返回一个非参考右值)。 – 2012-07-08 12:56:19

1

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

其他使用例子可以在这里找到:Example for boost shared_mutex (multiple reads/one write)?

+0

映射对于只读操作是线程安全的,当编写器正在工作时,我需要锁定所有其他编写者和读者。当读者工作时不需要锁。我怎样才能使用shared_mutex呢?我不知道任何关于它的信息(。谢谢! – Robert 2012-07-08 13:59:55

+0

@Robert:这个锁确实如此:当一个线程想要获得写入锁时,所有其他线程都被锁定,但是当一个线程想要读取任何其他线程时可以读取同样的时间(除非有人在写,就像我说过的)检查我链接的问题中的例子如何使用 – Tudor 2012-07-08 14:02:20

+0

正如ChristianStieber所说,'read_function'是一个误导性的名字,因为'std :: map'是'operator []'可以(将)实际修改地图,如果该地图不存在,则使用指定的键插入项目。 – 2012-07-08 14:03:36