【问题标题】:How locking actually works [closed]锁定的实际工作原理[关闭]
【发布时间】:2014-06-02 18:12:23
【问题描述】:

我有一个非常简单的问题。 在使用全局变量实现一个简单的锁定机制时。我不知道如何防止从 2 个进程/线程访问全局变量。

我的算法(采取2个过程)

  • 进程 p1 检查是否设置了变量 g,然后不要修改代码。
  • 如果未设置则设置然后修改代码。
  • 流程 2 相同。

执行时我得到了公平的结果,但它是否正确。 如果 2 条指令不是原子的,那么我对某些架构的怀疑,那么如何避免一次访问全局变量。

请给我一些基本的想法。

【问题讨论】:

  • 你问的是进程还是线程?进程不共享全局变量。线程可以。下一个重要的事情是你如何检查。一个简单的if 语句可能会以原子方式执行,更有可能不会,并且您可能会受到编译器或处理器重新排序的影响。
  • 您不使用互斥锁是否有原因?
  • 好的,我的观点是进程 (IPC) 或类似的东西都可以访问的东西。知道这些东西。没有别的。

标签: c multithreading locking


【解决方案1】:

使用原子方法来操作全局变量。

原子操作是 gcc 的“内置”操作。虽然它们通常不是“可移植的”,但大多数编译器都提供原子操作。

对于 GCC,你可能会实现这样的东西:

if(__sync_bool_compare_and_swap(&g, g, g+1))
   /* Changed by you. */;
else
   /* Another process changed it before you could. Perhaps try again. */

【讨论】:

  • 请注意,您实际上不应该这样做。出错的方法太多了,编写低级同步代码,除了用于实验目的,应该留给专家。不止一次,有人向我展示了他们的“超级优化同步原语”,我指出他们犯的一个又一个错误。您需要深入了解特定于平台的知识,例如,您的代码如何创建缓存一致性流量以及它如何受超线程影响以使其正确。
  • C11 支持 atomics 和对 atomics 的操作,例如static _Atomic int answer = 0; int expected = 42; atomic_compare_exchange_strong(&answer, &expected, 6 * 9);
  • @nosid 如果你真的了解 C++11 原子,你可以在某些情况下避免锁,而不需要深入的平台特定知识。不幸的是,做坏事并最终得到一个比仅使用互斥锁要差得多的解决方案仍然很容易。
  • 我喜欢 cmets,谢谢。但是需要做什么。有什么办法或做什么..如链接所示,它仅适用于英特尔,如果是的话,对 ARM 架构做什么。
猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多