我有一个多线程程序,该程序使用pthread互斥锁对几个整数进行同步。

当然,它的伸缩性不好。

我读到,共享数据的最佳方法是消除所有共享数据-但是,如果我需要整体“任务计数”(由共享整数确定)不应该大于该值,该怎么办?考虑到简单地在线程之间除以该整数是行不通的-一个线程可以比其他线程运行得更快,并在其他线程继续工作时停止。

另外,对共享整数使用原子操作也不起作用-当线程数很大时,由于写共享而导致性能下降。

更新:非常不希望挂起线程,我不仅需要可伸缩性,而且还需要确定性的线程延迟时间。

最佳答案

给每个线程自己的计数器。 (在线程本地存储中或在专用于该线程的页面上,以确保没有反弹的缓存行。)当您需要提供“总体任务计数”时,请控制线程从所有线程读取计数器。其他线程并将它们汇总在一个地方。

如果您需要一个完美的计数,则可以告诉所有线程暂停工作。如果您不介意计数接近但不够完美,请让它们继续运行。由于每个线程仅写入自己的数据,因此其运行速度应比在共享计数器上使用互斥锁快得多。整数写在nearly all platforms except SPARC上是原子的;如果您不关心SPARC,则无需采取任何措施来防止部分写入整数。

07-27 19:56