4

私はC++でブルートフォースプログラムに取り組んでおり、当面は英数字(小文字のみ)と不明な長さのパスワードのみを処理します。

私はクアッドコアコンピューターを使用しているので、可能性のリストを4つのセクションに分割し、それぞれに1つのスレッドを使用しています。

セクションは次のとおりです。

000...0 to 8zz...z
900...0 to hzz...z
i00...0 to qzz...z
r00...0 to zzz...z

スレッドをより有効に活用して速度を上げることはできますか?4つのスレッドのうち1つだけがパスワードに到達するため、プログラムの3/4は時間の無駄のように感じます。

どういうわけかスレッドを一緒に動作させることができれば、より効率的になるように思われますが、これを行う方法を考えることはできないようです。

どんなアドバイスも大歓迎です、私はスレッディングに全く慣れていません。

*編集:これは学術目的の非常に単純なプログラムであるため、実際には1つのパスワードを解読し、パスワードを見つけたら残りの3つのスレッドを強制終了するように合図していることを明確にする必要があります。*

4

4 に答える 4

4

ここにいくつかのアイデアがあります:

  • アトミックブール変数を使用して、パスワードが見つかったことをスレッド間で通信できます。各スレッドは、フラグが設定されているかどうかを定期的に(たとえば、次のパスワードを試行する直前に)チェックする必要があります。
  • 作業を静的に4つの等しい部分に分割する代わりに、パスワードの1つの中央リストを使用して、各スレッドが必要に応じてアイテムを取得できるようにすることもできます。
于 2013-01-14T19:17:14.897 に答える
1

4スレッドの場合、これは可能な限り効率的です。ブルートフォースではすべての可能性をチェックする必要があるため、ランタイムが無駄になることはありません...

于 2013-01-14T19:11:02.140 に答える
0

1つのグローバルbool変数を作成できます。これはtrue、一部のスレッドが正しいパスワードを見つけた場合(パスワードが見つかった場合はtrueに設定します)、たとえば、各スレッドで1000個のパスワードごとに試行した後、trueに設定されているかどうかを確認します。 。これにより、他のスレッドがすでに正しいパスワードを見つけている場合に、スレッドでの効率的でない反復が削減されます。

*最初に、このグローバル変数をに設定する必要がありますfalse

于 2013-01-14T19:43:35.763 に答える
0

ゼロに初期化されたセマフォと、そのセマフォを待機するキラースレッドを設定できます。スレッドが答えを見つけたら、セマフォをぶつけて、キラースレッドを解き放ち、他のスレッドをスレッド天国に送ることができるようにします。

これはグローバルフラグをチェックするのと同じです。カーネルではグローバルスレッドのみがチェックされ、すべての反復ではなく、コンテキストスイッチでのみチェックされます。

于 2015-07-15T16:49:07.630 に答える