2009-02-17 80 views
3

我需要并行化一个简单的密码破解程序,以便在n处理器系统上使用它。我的想法是创建n个线程,并在他们完成时为他们提供越来越多的工作。pthreads - 如何并行化作业

什么是知道线程何时完成的最佳方式?互斥体?在其他线程正在运行时不会经常检查此互斥锁吗?

+1

这个n处理器系统会成为Confiker僵尸网络吗? – 2009-02-17 22:44:59

+0

呃,不...暂时,n = 2 ;-)也许将来! – zakk 2009-02-17 23:01:09

回答

5

您可以拥有一个简单的队列结构 - 使用您喜欢的任何数据结构 - 然后在添加/删除项目时使用互斥锁。

如果你的线程抓住了他们需要在足够大的“块”中完成的工作,那么对互斥体的争用就会很少,所以开销很小。例如,如果每个线程一次抓取大约1秒的工作并独立工作1秒,那么对互斥锁的操作将非常少。

当他们没有更多的工作时,线程可以退出;主线程可以使用pthread_join等待。

1

使用线程之间的消息队列: -

主 - >进程(说去与此)。 Process - > Master(说我完成了 - 给我更多,或者,我找到了结果!)

使用此方法,线程只在系统执行时关闭 - 否则它正在处理数据或等待在消息队列上。

通过这种方式,MCP(我一直想这么说!)只是将消息和手作业处理到正在等待更多工作的线程。

这可能会更有效率,创建和销毁线程的所有时间。

1

通常情况下,您使用“条件变量”来处理这种情况,您想等待异步作业完成。

条件变量基本上是受互斥体保护的简单信号。 Pthread具有条件变量(请参阅例如pthread_cond_create(...)函数)。