我在多线程应用程序中使用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对象并正确同步此线程?
答案 0 :(得分:1)
看起来你需要的是一个典型的读写锁,允许任意数量的读者,但只有一个编写者。你可以看一下boost shared_mutex。
可在此处找到其他用法示例:Example for boost shared_mutex (multiple reads/one write)?
答案 1 :(得分:0)
好吧,因为std :: map没有内置锁,所以你必须使用一个单独的锁来保护地图。如果地图完全受到该锁的保护,你可以将map子类化为在那里添加锁定以及“锁定”和“解锁”调用,但是如果锁也将用于其他项目那么它可能不是最好的想法那样做。
至于“如何正确同步” - 这非常特定于手头的应用程序。但是,对于给出的示例,您还必须在读取操作周围插入锁定/解锁调用。
如果你有读/写锁,这也可能是其中之一的一个很好的应用程序。