キーのハッシュを計算する 16 のスレッドがあります。ハッシュを計算し、それが線形的に存在するかどうかを確認することは、CPU パワーの一部しか使用しないため、作業をスレッド間で分割しようとしています。現在、すべてのスレッドがミューテックス ロックを使用してアクセスできる単一のマップ コンテナーを使用しています。ただし、実際のハッシュにはほとんど時間がかからないため、スレッドはほとんどアイドル状態にあり、別のスレッドが map::count を使用してキーがマップに存在するかどうかを確認するのを待っています。
このプログラムの主な目的は、プロジェクトに追加する前に衝突がないことを確認する必要があるため、衝突を総当たりでチェックすることです。
すべてのスレッドが終了したら、各キーで各マップを直線的に検索するのではなく、個別のマップまたは他のコンテナーを使用して、そのキーが存在するかどうかを判断する方法はありますか? ある種の待ち行列システムはどうですか?
編集:これは、スレッド化しようとしている関数です:
int coll = 0;
map<long, bool> mymap;
string temp;
long myhash;
for (int i = 0; i < 256; i++)
for (int j = 0; j < 256; j++)
for (int k = 0; k < 256; k++)
{
temp = i;
temp += j;
temp += k;
temp += temp;
myhash = hash(temp.c_str());
if (mymap.count(myhash))
{
coll++;
cout << "Collision at " << i << " " << j << " " << k << endl;
}
else
{
mymap[myhash] = true;
}
}
cout << "Number of collisions: " << coll << endl;
cout << "Map size: " << mymap.size() << endl;