我有一个多线程程序,它使用pthread互斥锁在几个整数上进行同步。
当然它不能很好地扩展。
我读到共享数据的最佳方法是消除所有共享数据 - 但如果我需要整体“任务计数”(由共享整数确定),我该怎么办?不应该大于这个值?考虑在线程之间简单划分这个整数是行不通的 - 一个线程可以比其他线程运行得更快,并在其他线程继续工作时停止。
此外,对共享整数使用原子操作也不起作用 - 当线程数很大时,性能会因写入共享而降低。
更新:暂停线程非常不受欢迎,我不仅需要可扩展性,还需要线程延迟的确定性时间。
答案 0 :(得分:1)
为每个线程提供自己的计数器。 (在线程本地存储或专用于该线程的页面上,以确保您没有弹跳缓存行。)当您需要提供“总体任务计数”时,让控制线程读取所有的计数器其他线程并在一个地方总结。
如果您想要完美计数,您可以告诉所有线程暂停工作。如果你不介意计数接近但不完美让它们继续运行。由于每个线程只编写自己的数据,因此它应该比在共享计数器上使用互斥锁更快地运行 。整数写入在nearly all platforms except SPARC上是原子的;如果你不关心SPARC,你不需要做任何事情来阻止对整数的部分写入。