条件变量的误解

标签 c multithreading variables pthreads conditional-statements

假设我有一棵树,并且树的每个节点都有一个条件变量。

假设有 5 个节点试图插入到我的树中(已经有 10 个节点),由于某种原因,这 5 个节点无法插入(它们正在等待某些节点被删除),所以我让它们等待使用他们的条件变量。现在树中发生了删除,我想检查正在等待的节点是否正在等待该删除,因此我想向一个节点发出信号,我如何知道向哪个线程发出信号,我是否必须跟踪所有线程条件变量最初在插入中?

假设在某个删除操作中,我想向正在等待的线程 3 发出信号(以及另外 2 个线程),我如何专门向线程 3 发出信号?线程 3 是否还记得他试图插入的内容?

在我的删除函数中,当我发出信号时,我不知道该线程等待的条件变量是什么,因为每个节点都有一个条件变量,并且可以有多个节点,每个节点都有一个条件变量等待。我知道广播 all 会联系所有线程,但是如果没有它,我怎么能做到这一点,并明确指示一个线程最初想要在树中插入值 5,但由于 5 已经存在,所以它不能,并且知道5已经被删除了,应该插入5,但是随着5的等待,还有1,6,3,2在等待,所以我有5个条件变量,并且不知道哪个是5的。

这一切都是用 C 语言编写的,使用 Linux。

最佳答案

通常,您将条件变量与其用于等待的事物相关联。因此,如果线程 3 正在等待节点 X 被删除,它可能会等待节点 X 的条件变量上的信号。线程 3 不会等待它正在插入的节点的条件变量上的信号。如果线程 5 删除节点 X,那么它将在节点 X 的条件变量上发出信号。线程 5 不需要知道线程 3 正在等待;线程 5 不需要知道线程 3 正在等待。它只是在节点 X 的条件变量上发出信号,pthreads 管理通知正在等待该条件变量的线程的工作。

我有点担心您正在删除节点,并且可能会同时删除条件变量。如果要删除节点 X,则在等待它的线程被唤醒并且条件变量不再使用之前,您不会希望删除其条件变量。所以你的设计不清楚。

关于条件变量的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15976828/

相关文章:

C 内存映射结构数组泄漏

c - fwrite 似乎工作,memcpy 失败

batch-file - 在 Windows .cmd 文件或批处理文件中设置路径中包含空格的路径变量

c++ - 在 Bison 中有一种方法可以返回 token 的名称而不是其类型

c - 将文本文件读入链表

c# - Web Api Controller 和线程池

java - 编写 Java Server 以并发(同时)处理多个客户端

java - 如何检查多个 "wrong" boolean 值是否为真?

java - 如何创建可变数量的变量?

variables - 无法在Docker容器中更改环境变量