我需要并行化一个简单的密码破解程序,以便在 n 处理器系统上使用它。我的想法是创建 n 个线程并在它们完成时为它们提供越来越多的工作。
知道线程何时完成的最佳方法是什么?互斥体?在其他线程运行时不断检查这个互斥锁不是很昂贵吗?
我需要并行化一个简单的密码破解程序,以便在 n 处理器系统上使用它。我的想法是创建 n 个线程并在它们完成时为它们提供越来越多的工作。
知道线程何时完成的最佳方法是什么?互斥体?在其他线程运行时不断检查这个互斥锁不是很昂贵吗?
你可以有一个简单的队列结构——使用你喜欢的任何数据结构——然后在添加/删除项目时只使用互斥锁。
如果您的线程以足够大的“块”获取他们需要完成的工作,那么互斥锁上的争用就会非常少,因此开销也非常小。
例如,如果每个线程一次抓取大约 1 秒的工作并独立工作 1 秒,那么互斥体上的操作将非常少。
线程在没有更多工作时可以退出;然后主线程可以使用 pthread_join 等待。
通常,您对要等待异步作业完成的此类事情使用“条件变量”。
条件变量基本上是受互斥体保护的简单信号。Pthread 有条件变量(参见例如 pthread_cond_create(...) 函数)。
在线程之间使用消息队列:-
Master -> Process(说顺其自然)。过程 -> 大师(说我完成了 - 给我更多,或者,我找到了结果!)
使用它,线程仅在系统关闭时关闭 - 否则它正在处理数据或等待消息队列。
这样,MCP(我一直想这么说!)简单地处理消息并将作业交给正在等待更多工作的线程。
这可能比一直创建和销毁线程更有效。