【问题标题】:Two threads modifying same object at same time两个线程同时修改同一个对象
【发布时间】:2017-08-18 06:01:47
【问题描述】:

在我正在编写的一个简单的服务器-客户端机制中,服务器将一组键值映射存储在一个 STL 映射中。为了与多个客户端交谈,为每个客户端创建一个单独的线程,并且我使用 std::ref 将映射传递给线程(我需要一个公共密钥库)。虽然这可行,但是否有可能:

1) 如果两个客户端同时通信,那么两个线程会同时尝试修改映射?

2) 在这种情况下,会发生什么?

3) 我可以做些什么来避免坏事?

【问题讨论】:

标签: c++ multithreading


【解决方案1】:

1) 如果两个客户端同时通信,那么这两个 线程会尝试同时修改地图吗?

是的,他们会同时尝试修改

2) 在这种情况下,会发生什么?

您将有未定义的行为。任何事情都有可能发生。

3) 我可以做些什么来避免坏事?

使用std::lock_guard 来避免任何问题。您可以参考此链接了解更多详情: http://en.cppreference.com/w/cpp/thread/lock_guard

【讨论】:

  • 当然,不用担心
【解决方案2】:
  1. 是的。
  2. 取决于操作。如果两个线程都修改了映射的键结构,即插入或删除条目,则映射可能会失效。
  3. 您需要阻止对映射的并行写入访问。在写访问过程中也不应该发生读访问。查看读写互斥锁或自旋锁。

【讨论】:

  • 它是 UB,所以任何事情都可能发生——不仅仅是一张无效的地图
猜你喜欢
  • 2015-03-31
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2014-06-28
相关资源
最近更新 更多