- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 std::map
并获取我可以使用的单个元素:http://www.cplusplus.com/reference/map/map/
iterator find (const key_type& k);
mapped_type& at (const key_type& k);
mapped_type& operator[] (const key_type& k);
另外:lower_bound()
或 equal_range()
- 在这种情况下与 find()
相同。
我不能使用:
at()
- 因为它抛出异常,我测量了 10 倍的性能下降operator[]
- 因为它插入一个不存在的元素,所以这种行为是 Not Acceptable find()
- 是我想要的。但是我在多线程程序中使用std::map
,并通过锁std::mutex
来保护它。
还有从其他线程插入和删除 std::map
。
我应该保护std::map::end
吗?或者保证对于一个分配的容器它总是相同的?
我可以使用不受 std::mutex
保护的类似 static auto const map_it_end = map1.end();
的东西吗?
#include <iostream>
#include <string>
#include <mutex>
#include <thread>
#include <map>
std::map<std::string, std::string> map1 ( {{"apple","red"},{"lemon","yellow"}} );
static auto const map_it_end = map1.end();
std::mutex mtx1;
void func() {
std::lock_guard<std::mutex> lock1(mtx1);
auto it1 = map1.find("apple");
if(it1 != map_it_end) // instead of: if(it1 != map1.end())
std::cout << it1->second << ", ";
}
int main ()
{
std::thread t1(func);
std::thread t2(func);
t1.join();
t2.join();
return 0;
}
http://www.cplusplus.com/reference/map/map/end/
Data races The container is accessed (neither the const nor the non-const versions modify the container). No contained elements are accessed by the call, but the iterator returned can be used to access or modify elements. Concurrently accessing or modifying different elements is safe.
最佳答案
Should I protect
std::map::end
or is guaranteed that it always the same for one allocated container?
从技术上讲,任何对成员函数的调用都必须受到互斥量的保护,如果它可能与任何非常量成员函数同时发生的话。因此,如果任何线程可以插入或删除元素,那么在不锁定互斥体的情况下调用 end()
是不安全的。
Can I use something like this
static auto const map_it_end = map1.end();
which is not protected bystd::mutex
?
在某些情况下,您可以缓存尾后迭代器,因为 std::map
的尾后迭代器不会因插入和删除而失效,只有可能通过交换或移动 map 。
但是你为什么要这么做?缓慢的操作是 find()
而不是 end()
,因此如果您在仍然持有互斥量的同时调用 end()
那么它肯定会起作用.
如果其他线程可能正在删除元素,那么您需要在取消引用 find()
返回的迭代器时保持互斥锁,以确保它不会被另一个删除它的元素的线程无效指的是。因此,再次调用 end()
不会成为问题,因为您已经锁定了互斥量。
关于c++ - std::map::end 是线程安全的并且保证对于同一个容器它总是相同的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38214379/
根本不是 SQL 人员。让顾问编写以下代码。 首先,它确保只选择了一所小学 - 然后,在 BEGIN 之后,如果变量 @Term 等于 3,我们想要在 IF 语句下执行操作。问题就在这里。当 @Ter
以下 javascript 将 bool 值呈现到每个语句的右侧: var reg = new RegExp(/^[\w\/].*result\b/); console.log(reg.test('p
有什么区别: x = 1 while x < 5 do x += 1 print x end 和: x = 1 while x < 5 x += 1 print x end 将 do
对于初学者来说,我是编程的“菜鸟”,所以只需了解事情的工作原理并向社区寻求帮助。 但是...我想知道的是: 我想要构建一个 Web 应用程序,两个主要用户界面之一实际上是日历产品。每个日历项目都有 8
我正在尝试制作带有图片上传选项的表单。我正在使用 express-http-proxy作为我的 API 代理和 multer按照建议。 app.use('/api', upload.any(), pr
根据this中的回答和 this问题,C++ 标准在 § 23.2.1 中声明 end() 对于所有 STL 容器都具有恒定的时间复杂度。 如果我理解正确的话: std::forward_list 只
当我使用 css 属性 align-items 时,我看不到 flex-end 值或 end 值有任何视觉差异>. align-items: end 和 align-items: flex-end 有
Sub RowRangeMove() Sheets.Add().Name = "CopySheet" With Sheets("BigDataSet - Copy")
假设第 1 到 5,000 列中有 25,000 到 50,000 行数据,每列可能有不同的行数。所有数据都是连续的,即列中没有空行,也没有空列。 考虑以下代码 Dim i As Long Dim W
我在 MYSQL 中有一个表,必须在 postgresql 中转换它。 我正在使用以下命令创建表格。 create table emp(COMPLETE BOOLEAN NOT NULL, END B
我正在尝试使用 Lark 为 BASIC 创建一个 LALR 解析器,而且我很难解决“END”语句和“END IF”等语句之间的冲突。这是语法的简化版本: %ignore /[ \t\f]+/ pro
试图理解this MSDN sample但我对这些行感到困惑: IAsyncResult result = Dns.BeginGetHostEntry(args[0], null, null); Co
我在 http://www.sgi.com/tech/stl/nth_element.html 阅读了 std::nth_element 的描述 template void nth_element(
为什么标准将 end() 定义为末尾,而不是实际末尾? 最佳答案 最好的论据是Dijkstra himself 提出的论据。 : 您希望范围的大小是一个简单的差异end - begin; 当序列退化为
我试图根据一些参数停止页面的其余部分加载;但不确定语法是否正确。 @if(dayRes + dayTri == 2){Sorry, etc @Response.End} 上面抛出这个错误: CS150
在二分搜索中,我们通常有 low 和 high 变量,并且通常有一个 while 循环来测试 low <= high,如以下代码所示(来自维基百科): int SortedArray[max] = {
我将 MS-Test 与 Visual Studio 2010 和 Visual Basic 结合使用。 在下面的函数中,代码覆盖率告诉我,有一个未检查的 block ,并且带有 “End Try”
所以今天我一直致力于使用 Protractor 为 Angular JS 应用程序设置端到端测试。为了编写更清晰的测试,我使用了 Protractor 网站上描述的 Page Object 模式。 测
所以 meteor js 的全部意义在于允许用户一次对整个堆栈进行编码,但是如果我正在使用像 django 这样的旧框架之一,可以借用meteor js的前端代码吗?比如前端的数据库同步,模板化,或者
我正在使用 wavesurfer.js 和 recorder.js 制作采样器。一切都很顺利,除了我无法使用 play([start[, end]]) 调整循环长度。 wavesurfer.seekT
我是一名优秀的程序员,十分优秀!