并行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中是不可能的。不过,有不同的策略吗?
通常建议公开互斥还是应该避免
对象层次结构
假设我有一个由多页组成的文档。可通过以下方式访问此文档:
run
方法传递一个Runnable
类实例。通常,调度程序充当线程池。它会通知一些空闲线程,并将要处理的实例传递给它。我有一个天真的想法,让调度器只调用run
方法本身。但是,这不起作用,因为调用函数可能持有Runnable
也需要锁定的锁,从而导致死锁。有什么简单的方法可以避免这种情况吗?我很想向锁传递一个bool
,指示锁是否只是一个伪锁,应该什么都不做。但这可能只会在单线程环境中引入多线程问题(违反不变量)。。。有没有简单的方法让调度器切换到单线程模式
这些都是相当多的问题,我花了一段时间才把一切都写下来:)
不过我非常感谢你的帮助。对文献的建议将
也欢迎。“我是否应该跨线程传递(保持)锁(对我来说,这似乎是一种反模式)”-不是真的,不。在线程之间对具有内部同步对象的对象发送信号/排队并不罕见。如果将问题分为几个独立的问题,也许您可以得到一些答案。还要注意的是,征求建议与当前的SO实践背道而驰,很可能会很快被“搁置”,就像这次一样。在这里,你可能有更好的机会回答不太长的问题,并且可能有一个明确正确的答案(这样就可以选择一个成功的答案)