并行C+的最佳实践+;应用 我在设计并发C++应用程序方面有一些问题。我有一些更高级的问题(我知道一些基础知识,比如“什么是锁/互斥/条件变量”等等)

并行C+的最佳实践+;应用 我在设计并发C++应用程序方面有一些问题。我有一些更高级的问题(我知道一些基础知识,比如“什么是锁/互斥/条件变量”等等),c++,multithreading,design-patterns,concurrency,C++,Multithreading,Design Patterns,Concurrency,锁定功能层次结构 假设某个函数func对某个对象obj进行操作。在这些操作期间,有必要保持锁(可能是obj的成员变量)。现在假设 func在持有锁时调用子函数func_2。现在func_2对已锁定的对象进行操作。但是,如果我还想从其他地方调用func_2,而不持有锁,该怎么办?是应该锁定obj,还是不应该锁定?我认为有3种可能性: 我可以将一个bool传递到func_2,指示是否需要ot不锁定。 这似乎引入了很多样板代码 我可以使用递归锁,只需在func_2中始终锁定obj。递归锁 似乎 不过,

锁定功能层次结构

假设某个函数
func
对某个对象
obj
进行操作。在这些操作期间,有必要保持锁(可能是
obj
的成员变量)。现在假设
func
在持有锁时调用子函数
func_2
。现在
func_2
对已锁定的对象进行操作。但是,如果我还想从其他地方调用
func_2
,而不持有锁,该怎么办?是应该锁定obj,还是不应该锁定?我认为有3种可能性:

  • 我可以将一个
    bool
    传递到
    func_2
    ,指示是否需要ot不锁定。 这似乎引入了很多样板代码
  • 我可以使用递归锁,只需在
    func_2
    中始终锁定
    obj
    。递归锁 似乎 不过,这可能会有问题,请参见
  • 我可以假设
    func_2
    的每个调用方都已经持有锁。我会的 记录并强制执行(至少在调试模式下)。是 让函数对哪些锁是/不是进行假设是合理的 被调用线程持有?更一般地说,我如何从设计的角度做出决定 哪个功能应该锁定Obj,哪个应该假设它已经锁定
  • 你对此有什么建议吗

    公开锁/互斥锁

    到目前为止,我正在使用一种方法返回一个
    互斥锁&
    ,我将它提供给一个RAII
    。我认为如果我使用C++11,那么直接返回
    Lock
    并重载move构造函数将更能防止白痴。但这在C++03中是不可能的。不过,有不同的策略吗? 通常建议公开互斥还是应该避免

    对象层次结构

    假设我有一个由多页组成的文档。可通过以下方式访问此文档:

  • 用户通过更改/删除/插入/复制页面进行交互
  • 线程重新加载可见/已更改/等的页面
  • 显而易见的方法是为文档设置一个大锁,每个线程在访问文档时都必须持有该锁。这有一个明显的缺点,即渲染线程基本上是连续工作的,即使它们访问不同的页面。我有两个解决方案:

  • 使用读写互斥锁。在修改文档时,线程必须具有写访问权限 而重新排序的线程只需要读取访问权限
  • 对每一页加上一个文档使用一个锁。重新排序线程将保留页面 锁用户线程在更改页面时获取页面锁,此外 更改文档结构时文档锁定。 如果用户希望例如交换,可能需要持有多个页面锁 两页。在这种情况下,我认为必须有一个固定的锁定顺序
  • 这些方法在代码复杂度/执行时间方面如何比较?你推荐什么

    跨线程锁定

    再次考虑最后一点的场景。假设任务和线程之间存在某种关联。更重要的是,某些函数需要仅从特定线程调用(如果您必须知道我正在使用gtk,并且需要从单个线程执行与gtk的任何交互)。这种方法似乎是添加一个回调,由正确的线程处理。但是,如果我需要在整个操作过程中保持锁,会发生什么情况?我应该在线程之间传递(保持)锁吗(对我来说这似乎是一种反模式)

    单线程支持

    为了找到bug,我希望使用单线程模式。假设我有一个调度程序 它通过
    run
    方法传递一个
    Runnable
    类实例。通常,调度程序充当线程池。它会通知一些空闲线程,并将要处理的实例传递给它。我有一个天真的想法,让调度器只调用
    run
    方法本身。但是,这不起作用,因为调用函数可能持有
    Runnable
    也需要锁定的锁,从而导致死锁。有什么简单的方法可以避免这种情况吗?我很想向锁传递一个
    bool
    ,指示锁是否只是一个伪锁,应该什么都不做。但这可能只会在单线程环境中引入多线程问题(违反不变量)。。。有没有简单的方法让调度器切换到单线程模式

    这些都是相当多的问题,我花了一段时间才把一切都写下来:) 不过我非常感谢你的帮助。对文献的建议将
    也欢迎。

    “我是否应该跨线程传递(保持)锁(对我来说,这似乎是一种反模式)”-不是真的,不。在线程之间对具有内部同步对象的对象发送信号/排队并不罕见。如果将问题分为几个独立的问题,也许您可以得到一些答案。还要注意的是,征求建议与当前的SO实践背道而驰,很可能会很快被“搁置”,就像这次一样。在这里,你可能有更好的机会回答不太长的问题,并且可能有一个明确正确的答案(这样就可以选择一个成功的答案)