【问题标题】:C++ - synchronization of threadsC++ - 线程同步
【发布时间】:2017-12-27 09:12:32
【问题描述】:

我有这个问题

Foo * foo = new Foo();

void A(){
  foo->a();
}

void B(){
  foo->b();
}

void C(){
  foo->reloadAll();
}

一旦我进入方法C并开始重新加载foo,我不想调用A或B。但是,A或B可以一起调用。在这种情况下,我不想锁定任何线程。

如何同步?我可以使用 C++14 提供的功能。目前,我在原子变量上使用主动等待(而 loo 和睡眠),但这并不理想。

编辑:在线程中调用 A、B 或 C 由 GUI(用其他语言编写)驱动,因此我在 C++ 应用程序中没有真正的线程。

【问题讨论】:

  • C 调用时如果 A 或 B 已经执行了怎么办?
  • @Jeka 如果 A 或 B 正在执行,请等待它们完成调用 C。
  • 您可以考虑使用std::shared_mutex 并为AB 调用lock_shared()
  • 你确定你有一个多线程问题吗?几乎所有的 GUI 框架都只在 1 个线程中运行。
  • @nos 是的。 UI 在后台使用线程来调用方法和非阻塞 UI。

标签: c++ multithreading c++11 c++14


【解决方案1】:

看起来像一个读写器问题。 A 和 B 需要作为读者锁定,C 作为作者需要锁定。看这里:Reader/Writer Locks in C++

【讨论】:

  • 答案主要是使用boost或者旧的C/C++。
  • @MartinPerry:换句话说,您希望读取器/写入器锁功能可用特别是在C++14中。为什么不这样表述你的问题(并选择适当的标题)?目前你的问题看起来你甚至不知道读写锁(作为一种模式),所以给出的答案是合法的,很可能会得到最好的分数。
【解决方案2】:

我认为最好的选择是shared_mutex,方法 C 应该使用唯一锁,但 A 和 B 使用共享锁,请检查它是否适合您。

如果 C 被锁定,您也可以使用 try_lock_shared 从 A 和 B 返回,而不是等待。

【讨论】:

  • Shared_mutex 是 C++17。
  • @MartinPerry - 但std::shared_timed_mutex 是 C++14。计时功能是可选的。
【解决方案3】:

使用两个unique locks 怎么样,一个用于a,一个用于b。 a/b开始时加锁,a/b结束时解锁,c分别加锁/解锁?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多