Как уже упоминалось @ Matthieu Brucher , у вас есть проблема с общим доступом к password
.
Еще одна проблема - оператор exit(0);
.Вы можете распараллеливать структурированные блоки только с одной точкой выхода внизу (т. Е. Более или менее блок операторов без каких-либо exit
, return
, goto
...).Таким образом, заявление о выходе не будет законным.Это кажется логичным: если поток достигает exit
, что другие должны делать?Откуда они знают, что им тоже нужно выйти?
Однако существуют определенные директивы для отмены параллельного цикла, в значительной степени то, что мог бы сделать оператор break;
.Директива omp cancel
будет сигнализировать всем потокам о выходе из параллельного цикла или параллельной области.omp cancellation point
- это точка, в которой потоки будут проверять, не было ли запрошено отмены.
Вам нужно будет найти, где должна быть поставлена точка отмены : слишком частое посещениезатраты с точки зрения накладных расходов (помещение его во внутренний цикл может быть неэффективным), но недостаточно часто означает, что поток может продолжать работать слишком долго, прежде чем осознает, что он должен выйти из цикла (помещение его в самый внешний цикл означает, чтотемы почти никогда не будут проверяться на отмену).
char password_found[17];
int flag_found=0;
#pragma omp parallel shared(password_found,flag_found)
{
char password[17] = "################"; //this is a thread private variable
// These will be done in parallel
#pragma omp for collapse(3)
for (int s = 0; s < 6; s++)
for (int t = 0; t < 6; t++)
for (int u = 0; u < 6; u++)
{
password[0] = alphabet[s];
password[1] = alphabet[t];
password[2] = alphabet[u];
// For every s,t,u, a single thread will loop through these
for (int v = 0; v < 6; v++)
for (int w = 0; w < 6; w++)
for (int x = 0; x < 6; x++)
{
password[3] = alphabet[v];
password[4] = alphabet[w];
password[5] = alphabet[x];
encrypt(plaintext, strlen((char *)plaintext),
password, iv, ciphertextnew);
if (strncmp(ciphertext, ciphertextnew, 16) == 0)
{
printf("\n%s", password);
printf(" Here is the correct key!\n\n");
flag_found=1;
strcpy(password_found,password); // Copy thread-private copy to shared variable
// Now, signal everyone to stop
#pragma omp cancel parallel
}
printf("\n%s is bad", password);
} // end inner group of loops
// Threads will check here is they should stop
#pragma omp cancellation point parallel
} // end of the outer group of loops
} // end of parallel region
// Do something now //
if (flag_found){
printf("\nThe password is %s\n",password_found);
return 0;
}else{
printf("Password not found\n");
return 1;
}