Простой пример многопоточности
Помогите реализовать пример программы. Правильно ли я делаю или можно еще проще сделать? Ну и программа у меня зависает на строчке auto r = f.get();
Как сделать что бы потоки завершили работу, при нахождении одним из потока ключа?
Это задача пример. То что она будет работать на моем компе 3 года это не важно.
#include <iostream>
#include <future>
#include <vector>
#define KEY_PASS (0xFFAAFFAABBCCDDEE)
bool checkPass(uint64_t pass) {
return pass == KEY_PASS;
}
const uint64_t STEP = 0x1000000000000000;
uint64_t funcAsync(uint64_t begin) {
for (uint64_t i = 0; i < STEP; ++i) {
if (checkPass(begin + i)) {
return i;
}
}
return uint64_t(-1);
}
int main() {
// Пример без работы с потоками
// for (uint64_t i = 0; i < UINT64_MAX; ++i) {
// if (checkPass(i)) {
// std::cout << std::hex << i << std::endl;
// break;
// }
// }
// Пример с потоками
uint64_t i = 0;
std::vector<std::future<uint64_t>> v;
do {
v.push_back(std::async(std::launch::async, funcAsync, i));
i += STEP;
std::cout << (i >> 60) << " open threads" << std::endl;
} while (i != 0);
for (auto& f: v) {
auto r = f.get();
if (r != uint64_t(-1)) {
std::cout << std::hex << r << std::endl;
break;
}
}
}
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
// $ g++ -std=c++11 -Wall -Wpedantic -Wextra -pthread futur.cpp -o futur
#include <iostream>
#include <future>
#include <vector>
#define KEY_PASS (0xFFAAFFAABBCCDDEE)
bool checkPass(uint64_t pass) {
return (random() & 0xff) == 0 ;
//return pass == KEY_PASS;
}
const uint64_t STEP = 0x1000000000000000;
volatile std :: atomic < bool > flag_stop{ false };
struct s_result {
bool valid ;
uint64_t value ;
} ;
s_result funcAsync(uint64_t begin) {
for (uint64_t i = 0; i < STEP; ++i) {
if ( flag_stop ) s_result{false,uint64_t(-1)};
if (checkPass(begin+i)) {
flag_stop = true ;
return s_result{true,begin + i};
}
}
return s_result{false,uint64_t(-1)};
}
int main() {
// Пример без работы с потоками
// for (uint64_t i = 0; i < UINT64_MAX; ++i) {
// if (checkPass(i)) {
// std::cout << std::hex << i << std::endl;
// break;
// }
// }
// Пример с потоками
srandom(time(nullptr));
uint64_t i = 0;
std::vector<std::future<s_result>> v;
do {
v.push_back(std::async(std::launch::async, funcAsync, i));
i += STEP;
std::cout << (i >> 60) << " open threads" << std::endl;
} while (i != 0);
for (auto& f: v) {
auto r = f.get();
if ( r.valid ) {
std::cout << "found " << std::hex << r.value << std::endl;
break;
}
}
}