当前位置: 首页 > 知识库问答 >
问题:

std::notify\u one()中的“单个总订单”是什么意思?

孟英锐
2023-03-14

我读过C 11内存模型中的并发性:原子性和易失性以及std::memory\u order\u seq\u cst的工作原理,它没有多大帮助,直接回答了我的问题。

来自https://en.cppreference.com/w/cpp/thread/condition_variable/notify_one:

notify one()和wait for()的三个原子部分(解锁等待、唤醒和锁定)的效果以一个总的顺序发生,可以看作是原子变量的修改顺序:顺序特定于这个单独的条件变量。例如,这使得notify\u one()无法延迟并解除阻止在调用notify\u one()之后立即开始等待的线程。

“以一个总的顺序进行”是什么意思?这与下一句“这使它不可能……是制造出来的”有什么关系?(这似乎说明了因果关系)。

我一个字一个字地读了10多遍,不明白它在说什么...维基百科对“总订单”的定义帮不上什么忙。

共有1个答案

闻人树
2023-03-14

“以一个总的顺序进行”是什么意思?

这意味着每个线程都看到相同的操作序列。例如,使用多个非原子变量,线程C可以看到线程A对int a的更改,然后看到线程B对int b的更改,而线程D在A之前看到B的更改。有多个不兼容的时间线,其中事件发生在其他事件之前,可能每个线程都不同意另一个。如果没有同步机制(如std::condition_variable),就不可能防止不需要的系统行为。

总顺序意味着每个元素都可以与其他元素进行比较(与部分顺序相比,部分顺序中的某些元素对是不可比较的)。在这种情况下,存在事件的时间线。它是单一的,因为所有线程都同意它。

这与下一句话“例如,这使得notify\u one()无法延迟并取消阻止在调用notify\u one()后立即开始等待的线程”有何关系?

因为所有线程都同意事情发生的顺序,所以您无法在任何地方观察到其原因之前的效果。

 类似资料:
  • 问题内容: 我有2个实体:汽车和车轮(oneToMany),我想检索我的汽车,其中有所有车轮,并且(这是棘手的部分)由wheels.location排序。下面的代码引发异常,并显示消息“非法尝试取消引用集合”。 任何想法如何做到这一点,如果这可以在HQL中进行? 问题答案:

  • 问题内容: 您能否举一个示例以及其他示例来说明何时以及何时不使用Lambda?我的书给了我一些例子,但它们令人困惑。 问题答案: Lambda源自Lambda演算(AFAIK),最初是在Lisp中实现的,它基本上是一个匿名函数- 该函数没有名称,可以在线使用,换句话说,您可以将标识符分配给lambda函数在单个表达式中如下所示: 这将分配给匿名函数,该函数接受1个参数x,并且在函数主体中将2加到x

  • 我是Eureka的新手,我从我的Eureka服务器(localhost:8761/)的主页上看到了这些信息。我没有从官方文件中找到任何关于“续费”和“续费门槛”的解释。谁能解释一下这些话吗?谢谢

  • 问题内容: 哪些类型的对象属于“可订阅”范围? 问题答案: 它基本上意味着对象实现了该方法。换句话说,它描述的是“容器”对象,这意味着它们包含其他对象。这包括字符串,列表,元组和字典。

  • 下面我写了一个C++函数,它通过一个整数向量进行循环。每通过一次,它就从所有的数字中减去最小的数字。它应该在每次传递时返回非零元素的数量(这存储在向量结果中并返回)。然而,每当我尝试运行时,我都会得到“std::bad_alloc”。当删除行“flag=true”时,错误就会消失。我将需要它工作,以便while循环中断。帮我修好这个。

  • 问题内容: 我正在学习Go,到目前为止对它印象深刻。我已经阅读了golang.org上的所有在线文档,并且在Chrisnall的“ The Go编程语言短语”中走了一半。我了解渠道的概念,并认为它们将非常有用。但是,我一定错过了一些重要的过程,因为我看不到单向通道的意义。 如果我正确地解释了它们,则只能在其上接收只读通道,而只能在其上传输只写通道,那么为什么有一个可以发送但从不接收的通道?可以将它