【问题标题】:multithreading with calling the same function调用相同函数的多线程
【发布时间】: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


【解决方案1】:

使用 Windows 函数和静态全局互斥锁的示例。

static HANDLE hMutex;    // initialized elsewhere
// ...

void DisplayInt(int value)
{
    WaitForSingleObject(hMutex);
    // ... check value and display message
    ReleaseMutex(hMutex);
}

【讨论】:

  • 一个更复杂的选择是创建另一个线程,显示通过某种形式的线程间消息传递给它的值。同样,它将避免显示与先前显示的值相同的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2015-04-06
相关资源
最近更新 更多