【发布时间】:2013-02-01 06:48:36
【问题描述】:
Odd even number printing using thread 我遇到了这个问题,想讨论 C++ 中的解决方案。我能想到的使用 2 个二进制信号量奇数和偶数信号量。偶数信号量初始化为 1,奇数信号量初始化为 0。
**T1 thread function**
funOdd()
{
wait(even)
print odd;
signal(odd)
}
**T2 thread function**
funEven()
{
wait(odd)
print even
signal(even)
}
除此之外,如果我的函数只生成数字并且有第三个线程 T3 将打印这些数字,那么理想的设计应该是什么?我使用了一个数组,其中奇数将放置在奇数位置,偶数将放置在偶数位置。 T3 将从这个数组中读取,这将避免任何线程在这个数组上的安全,如果 T3 没有找到任何索引,那么它将等到该索引被填充。另一种解决方案是使用一个队列,该队列将具有一个互斥体,T1 和 T2 在插入时可以使用该互斥体。
请对此解决方案发表评论,以及如何提高效率。
编辑使问题更加清晰:总体问题是我有两个生产者(T1,T2)和一个消费者(T3),我的生产者是相互依赖的。
【问题讨论】:
-
如果你想要串行行为,不要使用线程。
-
在这种情况下我可以避免线程,但这是非常有效的场景,我的 2 个线程相互依赖。
-
我非常努力地关注这个问题,并发现如果没有 code(一种近乎通用的语言,除了不寻常的 var 名称),描述就很混乱跟随,在某些地方几乎是不可能的。 看起来您有两个生产者 (T1,T2) 和一个消费者 (T3),但您的生产者是相互依赖的。我也很好奇 “如果 T3 没有找到任何索引,那么它将等到该索引被填充。” 在没有 some 类型的同步的情况下会保持不变。最后,“非常有效”?有效有点。是,或者不是。
-
@WhozCraig T3 可以休眠一段时间并再次检查该索引。如果索引已填充,则移动到下一个 else 再次睡眠。为什么你认为我们需要对数组进行同步你能解释一下我需要同步的场景吗?
-
这个问题有后续吗?最后,你自己的答案是什么?
标签: c++ multithreading thread-safety semaphore