【发布时间】:2014-02-18 18:09:53
【问题描述】:
我想出了一个被要求用 C++ 编写代码的问题。所以,我需要使用 C++ 同步原语。
问:创建一个接受整数作为参数并在控制台上打印的方法(例如 foo)。此方法由多个线程访问。如果两个或多个线程调用具有相同值的方法,那么只有一个线程应该允许打印其他线程应该等待的值。如果值不同,则所有线程都应允许打印该值。
我的建议是使用全局哈希表,比如说 unordered_map(i, semaphore) 映射。因此,当调用 foo(i) 时, foo 会检查哈希表。如果 i 不在哈希表中,我们添加 map[i]=semaphore(0)。当我打印时,调用 map[i].release() 以允许其他等待线程输入我继续他们的打印操作。另一方面,如果 i 已经在哈希中,则意味着具有相同输入的其他线程正在运行,因此它应该通过 map[i].aquire() 等待。
希望您能帮助我找到更好的解决方案或此提案的更正版本。
【问题讨论】:
-
你的解决方案有什么问题?
-
@nosid 我认为使用全局哈希表不是一种可靠的方法,因此应该有更好的解决方案。
-
控制台输出是否已经同步?如果没有,你也必须处理它。回到最初的问题,该方法只需要跟踪最新的值输出,其他线程不会等待(访问/更新最新值输出时的互斥锁或信号量除外),它们的如果与最后一个值输出匹配,则输出请求将被忽略。
-
@rcgldr 你能提供一个关于你的方法的伪代码吗?很遗憾,我不完全理解你是如何解决这个问题的。
标签: c++ multithreading semaphore