【发布时间】:2019-10-02 23:16:17
【问题描述】:
问题:假设我们有 n 个线程,每个线程接收一个介于 1 和 n 之间的随机唯一数。我们希望线程按排序顺序打印数字。
简单的解决方案(使用 n 个信号量/互斥量):我们可以使用 n 个互斥锁(或类似的信号量),其中线程 i 等待获取互斥锁编号 i 并解锁编号 i + 1。此外,线程 1 没有等待。
但是,我想知道是否可以模拟类似的逻辑使用单个信号量(类型为 sem_t)来实现以下逻辑:(i 是介于 1 到 n 之间的数字)
编号为 i 的线程作为输入,等待获取信号量上的 (i-1) 个计数,然后 打印,释放 i 的计数。不用说,线程一没有 等等。
我知道与 Java 不同,sem_t 不支持信号量值的任意增加/减少。此外,由于异步,编写一个 for 循环来执行 (i-1) 等待和 i 释放将无法正常工作。
我一直在寻找答案,但找不到任何答案。这在普通的C语言中可能吗?如果不是,是否可以在 C++ 中仅使用一个变量或信号量?总的来说,使用 ONE 信号量做到这一点最浪费的方法是什么。
由于我是多线程编程的新手,请随时编辑问题。
【问题讨论】:
-
这对于
std::conditional_variable来说是微不足道的。可以用吗? -
@selbie 我更喜欢一个也可以在纯 C 上工作的答案。不过,我也想知道您的解决方案。
-
告诉我们更多关于 i 的信息:我猜它是一个所有大于 0 的自然数的元素?你知道它的上限吗?我从你的问题中假设它是连续的?哪个 C++ 标准? C++20 好吗?
-
是的,n 是自然正数。而 i 只是一个从 1 到 n 的计数器。
-
如果你想用“C”来回答,为什么把问题标记为 C++?
标签: c++ c multithreading mutex semaphore