C++ 多线程C程序中的信号量互斥并发问题
如何设计一个多线程C程序来避免信号量互斥并发有几种方法 最好的方法是消除线程之间的所有共享数据。虽然这并不总是可行的,但尽可能多地消除共享数据总是好的 之后,您需要开始研究无锁编程。无锁编程现在有点流行,但肮脏的秘密是,使用基于锁的并发(如互斥和信号量)通常是更好的主意。无锁编程很难得到正确的结果。查阅赫伯·萨特关于这个主题的文章,或者维基百科页面。有很多关于无锁同步的好资源 中间的某个地方是关键部分。如果您在Windows上编程,关键部分应该优先于互斥锁,因为它们可以做一些工作来避免完全互斥锁和解锁的开销。首先尝试这些方法,如果您的性能不可接受(或者您的目标平台没有关键部分),那么您可以研究无锁技术。有几种方法 最好的方法是消除线程之间的所有共享数据。虽然这并不总是可行的,但尽可能多地消除共享数据总是好的 之后,您需要开始研究无锁编程。无锁编程现在有点流行,但肮脏的秘密是,使用基于锁的并发(如互斥和信号量)通常是更好的主意。无锁编程很难得到正确的结果。查阅赫伯·萨特关于这个主题的文章,或者维基百科页面。有很多关于无锁同步的好资源C++ 多线程C程序中的信号量互斥并发问题,c++,c,C++,C,如何设计一个多线程C程序来避免信号量互斥并发有几种方法 最好的方法是消除线程之间的所有共享数据。虽然这并不总是可行的,但尽可能多地消除共享数据总是好的 之后,您需要开始研究无锁编程。无锁编程现在有点流行,但肮脏的秘密是,使用基于锁的并发(如互斥和信号量)通常是更好的主意。无锁编程很难得到正确的结果。查阅赫伯·萨特关于这个主题的文章,或者维基百科页面。有很多关于无锁同步的好资源 中间的某个地方是关键部分。如果您在Windows上编程,关键部分应该优先于互斥锁,因为它们可以做一些工作来避免完全互斥锁
中间的某个地方是关键部分。如果您在Windows上编程,关键部分应该优先于互斥锁,因为它们可以做一些工作来避免完全互斥锁和解锁的开销。首先尝试这些方法,如果您的性能不可接受(或者您的目标平台没有关键部分),那么您可以研究无锁技术。最好编写无锁代码。这很难,但有可能
最好对无锁代码进行编程。这很难,但有可能 确保在线程之间传递数据结构,始终知道数据只属于哪个线程。如果您使用(正如Dan之前提到的)e.q.无锁队列来传递数据,那么您不应该遇到太多并发问题(因为您的代码的行为更像其他等待数据到达的代码) 但是,如果您正在将单线程代码迁移到多线程代码,这将是一个完全不同的问题。这很难。大多数情况下,没有优雅的解决方案。确保在线程之间传递数据结构,始终知道数据只属于哪个线程。如果您使用(正如Dan之前提到的)e.q.无锁队列来传递数据,那么您不应该遇到太多并发问题(因为您的代码的行为更像其他等待数据到达的代码)
但是,如果您正在将单线程代码迁移到多线程代码,这将是一个完全不同的问题。这很难。而且大多数时候都没有优雅的解决方案。另外,请看一下InterlockedXXX系列,它可以在多线程环境中执行原子操作
- 作用
- 作用
- 作用
InterlockedXXX
系列
- 作用
- 作用
- 作用