3

我有一个多线程程序,它使用 pthread 互斥锁在几个整数上进行同步。
当然,它不能很好地扩展。
我读到共享数据的最佳方法是消除所有共享数据 - 但是如果我需要总体“任务计数”(由共享整数确定)不应该大于这个值,我该怎么办?考虑在线程之间简单地划分这个整数是行不通的——一个线程可以比其他线程运行得更快,并且在其他线程继续工作时停止。
此外,对共享整数使用原子操作也不起作用 - 当线程数很大时,由于写入共享,性能会下降。
更新:挂起线程是非常不可取的,我不仅需要可伸缩性,还需要确定性的线程延迟时间。

4

1 回答 1

1

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

如果你想要一个完美的计数,你可以告诉所有线程暂停工作。如果您不介意计数接近但不完美,请让它们继续运行。由于每个线程只写入自己的数据,因此它的运行速度应该在共享计数器上使用互斥锁快得多。整数写入在几乎所有平台上都是原子的,除了 SPARC ;如果你不关心 SPARC,你不需要做任何事情来防止部分写入整数。

于 2012-06-28T23:43:33.500 回答