Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多线程C程序中的信号量互斥并发问题_C++_C - Fatal编程技术网

C++ 多线程C程序中的信号量互斥并发问题

C++ 多线程C程序中的信号量互斥并发问题,c++,c,C++,C,如何设计一个多线程C程序来避免信号量互斥并发有几种方法 最好的方法是消除线程之间的所有共享数据。虽然这并不总是可行的,但尽可能多地消除共享数据总是好的 之后,您需要开始研究无锁编程。无锁编程现在有点流行,但肮脏的秘密是,使用基于锁的并发(如互斥和信号量)通常是更好的主意。无锁编程很难得到正确的结果。查阅赫伯·萨特关于这个主题的文章,或者维基百科页面。有很多关于无锁同步的好资源 中间的某个地方是关键部分。如果您在Windows上编程,关键部分应该优先于互斥锁,因为它们可以做一些工作来避免完全互斥锁

如何设计一个多线程C程序来避免信号量互斥并发

有几种方法

最好的方法是消除线程之间的所有共享数据。虽然这并不总是可行的,但尽可能多地消除共享数据总是好的

之后,您需要开始研究无锁编程。无锁编程现在有点流行,但肮脏的秘密是,使用基于锁的并发(如互斥和信号量)通常是更好的主意。无锁编程很难得到正确的结果。查阅赫伯·萨特关于这个主题的文章,或者维基百科页面。有很多关于无锁同步的好资源

中间的某个地方是关键部分。如果您在Windows上编程,关键部分应该优先于互斥锁,因为它们可以做一些工作来避免完全互斥锁和解锁的开销。首先尝试这些方法,如果您的性能不可接受(或者您的目标平台没有关键部分),那么您可以研究无锁技术。

有几种方法

最好的方法是消除线程之间的所有共享数据。虽然这并不总是可行的,但尽可能多地消除共享数据总是好的

之后,您需要开始研究无锁编程。无锁编程现在有点流行,但肮脏的秘密是,使用基于锁的并发(如互斥和信号量)通常是更好的主意。无锁编程很难得到正确的结果。查阅赫伯·萨特关于这个主题的文章,或者维基百科页面。有很多关于无锁同步的好资源


中间的某个地方是关键部分。如果您在Windows上编程,关键部分应该优先于互斥锁,因为它们可以做一些工作来避免完全互斥锁和解锁的开销。首先尝试这些方法,如果您的性能不可接受(或者您的目标平台没有关键部分),那么您可以研究无锁技术。

最好编写无锁代码。这很难,但有可能


最好对无锁代码进行编程。这很难,但有可能

确保在线程之间传递数据结构,始终知道数据只属于哪个线程。如果您使用(正如Dan之前提到的)e.q.无锁队列来传递数据,那么您不应该遇到太多并发问题(因为您的代码的行为更像其他等待数据到达的代码)

但是,如果您正在将单线程代码迁移到多线程代码,这将是一个完全不同的问题。这很难。大多数情况下,没有优雅的解决方案。

确保在线程之间传递数据结构,始终知道数据只属于哪个线程。如果您使用(正如Dan之前提到的)e.q.无锁队列来传递数据,那么您不应该遇到太多并发问题(因为您的代码的行为更像其他等待数据到达的代码)


但是,如果您正在将单线程代码迁移到多线程代码,这将是一个完全不同的问题。这很难。而且大多数时候都没有优雅的解决方案。

另外,请看一下InterlockedXXX系列,它可以在多线程环境中执行原子操作

  • 作用
  • 作用
  • 作用

另外,请看一下在多线程环境中执行原子操作的
InterlockedXXX
系列

  • 作用
  • 作用
  • 作用