C 锁定的实际工作原理

C 锁定的实际工作原理,c,multithreading,locking,C,Multithreading,Locking,我有一个很简单的问题。 在使用全局变量实现一个简单的锁定机制时,我不知道如何阻止2个进程/线程访问全局变量 我的算法(采取2个过程) 过程p1检查是否设置了变量g,然后不要修改代码 如果未设置,则进行设置,然后修改代码 过程2也是如此 执行时我得到了公平的结果,但它是正确的。 我怀疑在某些架构中,如果2条指令不是原子指令,那么如何避免一次访问全局变量 请给我一些基本的想法。使用原子方法来操作全局变量 原子操作是“内置”的。虽然它们通常不是“可移植的”,但大多数编译器都提供原子操作 对于GCC

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

我的算法(采取2个过程)
  • 过程p1检查是否设置了变量g,然后不要修改代码
  • 如果未设置,则进行设置,然后修改代码
  • 过程2也是如此
执行时我得到了公平的结果,但它是正确的。 我怀疑在某些架构中,如果2条指令不是原子指令,那么如何避免一次访问全局变量


请给我一些基本的想法。

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

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

对于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. */

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

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

对于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. */

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

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

对于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. */

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

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

对于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支持原子和原子上的操作,例如
static\u Atomic int answer=0;int预期为42;原子比较交换强(回答和预期,6*9)
@nosid如果您真正了解C++11原子,您可以在某些情况下避免锁定,而无需深入了解特定于平台的知识。不幸的是,它仍然很容易把事情做得很糟糕,最终得到的解决方案远远不如仅仅使用互斥。我喜欢这些评论,谢谢。但是需要做什么。有什么方法或者怎么做吗..正如链接显示的那样,它只适用于intel如果是的话,那么应该为ARM架构做什么。请注意,实际上不应该这样做。出错的方法太多了,编写低级同步代码(不是为了实验目的)应该留给专家。不止一次,有人向我展示了他们的“超级优化同步原语”,我指出了他们犯下的一个又一个错误。您需要深入了解特定于平台的知识,例如,您的代码如何创建缓存一致性通信以及它如何受超线程的影响,以确保正确。C11支持原子和原子上的操作,例如
static\u Atomic int answer=0;int预期为42;原子比较交换强(回答和预期,6*9)
@nosid如果您真正了解C++11原子,您可以在某些情况下避免锁定,而无需深入了解特定于平台的知识。不幸的是,它仍然很容易把事情做得很糟糕,最终得到的解决方案远远不如仅仅使用互斥。我喜欢这些评论,谢谢。但是需要做什么。有什么方法或者怎么做吗..正如链接显示的那样,它只适用于intel如果是的话,那么应该为ARM架构做什么。请注意,实际上不应该这样做。出错的方法太多了,编写低级同步代码(不是为了实验目的)应该留给专家。不止一次,有人向我展示了他们的“超级优化同步原语”,我指出了他们犯下的一个又一个错误。您需要深入了解特定于平台的知识,例如,您的代码如何创建缓存一致性通信以及它如何受超线程的影响,以确保正确。C11支持原子和原子上的操作,例如
static\u Atomic int answer=0;int预期为42;原子比较交换强(回答和预期,6*9)
@nosid如果您真正了解C++11原子,您可以在某些情况下避免锁定,而无需深入了解特定于平台的知识。不幸的是,它仍然很容易把事情做得很糟糕,最终得到的解决方案远远不如仅仅使用互斥。我喜欢这些评论,谢谢。但是需要做什么。有什么方法或者怎么做吗..正如链接显示的那样,它只适用于intel如果是的话,那么应该为ARM架构做什么。请注意,实际上不应该这样做。出错的方法太多了,编写低级同步代码(不是为了实验目的)应该留给专家。不止一次,有人向我展示了他们的“超级优化同步原语”,我指出了他们犯下的一个又一个错误。您需要深入了解特定于平台的知识,例如,您的代码如何创建缓存一致性通信以及它如何受超线程的影响,以确保正确。C11支持原子和原子上的操作,例如
static\u Atomic int answer=0;int预期为42;原子比较交换强(回答和预期,6*9)
@nosid如果您真正了解C++11原子,您可以在某些情况下避免锁定,而无需深入了解特定于平台的知识。不幸的是,它仍然很容易把事情做得很糟糕,最终得到的解决方案远远不如仅仅使用互斥锁