如何动态创建多个对应多个类的线程来解很多数独
How to dynamically create multiple threads with multiple corresponding classes for solving many sudoku puzzles
我的任务是编写一个多线程程序,通过动态确定机器上可以 运行 的最大线程数来解决一组数独谜题,然后分配那么多线程来从中获取单个谜题包含所有数独谜题的文件。
类似的东西:我们已经确定8个线程可以在这台机器上运行,所以我们将分配8个线程。然后这 8 个线程轮流从堆中抓取单个数独谜题并解决它们,并将它们与解决方案一起写入一个新文件
我目前拥有的是一个完整的工作代码,用于获取第一个谜题、解决并将其写入解决方案文件。但我需要让它成为多线程,并让它对所有其他谜题也这样做。我有一个 class 保存名为 SudokuGrid 的数独游戏数据,它具有 9x9 数组。
我正在为分配线程和为每个线程分配一个 class 的概念而苦苦挣扎,我想我可以生成一个数组来保存线程但是我如何分配相应的class 个实例? 我相信每个线程都需要一个实例,因为它们将处理自己不同的谜题。我应该为此使用 std::thread。
为了直接解决您的问题(即不帮助您解决难题的逻辑,而只是帮助您为方法分配和管理线程),这是一个如何设置要执行的对象的简单示例一些在不同线程上工作:
#include <iostream>
#include <random>
#include <thread>
struct Foo
{
int count;
void Bar (int n)
{
count = 0;
for (int i = 0; i < n; ++i)
count += std::rand() % n;
}
};
void SetUpMultiThreading (std::vector<Foo> & foo)
{
int n = foo.size();
std::vector<std::thread> threads(n);
// the below (2*i+5) is just some mock data input
for (int i = 0; i < n; ++i)
threads[i] = std::thread(&Foo::Bar, std::ref(foo[i]), 2*i+5);
// Note that without std::ref (or a custom wrapper instead)
// then the foo element would be copied to the std::thread
// function, so you'd lose access to the results
for (auto & t : threads)
t.join();
}
void CheckWork (const std::vector<Foo> & foo)
{
for (auto & f : foo)
std::cout << f.count << std::endl;
}
int main ()
{
srand(time(NULL));
const int n = 8;
std::vector<Foo> foo(n);
SetUpMultiThreading(foo);
CheckWork(foo);
}
我的任务是编写一个多线程程序,通过动态确定机器上可以 运行 的最大线程数来解决一组数独谜题,然后分配那么多线程来从中获取单个谜题包含所有数独谜题的文件。
类似的东西:我们已经确定8个线程可以在这台机器上运行,所以我们将分配8个线程。然后这 8 个线程轮流从堆中抓取单个数独谜题并解决它们,并将它们与解决方案一起写入一个新文件
我目前拥有的是一个完整的工作代码,用于获取第一个谜题、解决并将其写入解决方案文件。但我需要让它成为多线程,并让它对所有其他谜题也这样做。我有一个 class 保存名为 SudokuGrid 的数独游戏数据,它具有 9x9 数组。
我正在为分配线程和为每个线程分配一个 class 的概念而苦苦挣扎,我想我可以生成一个数组来保存线程但是我如何分配相应的class 个实例? 我相信每个线程都需要一个实例,因为它们将处理自己不同的谜题。我应该为此使用 std::thread。
为了直接解决您的问题(即不帮助您解决难题的逻辑,而只是帮助您为方法分配和管理线程),这是一个如何设置要执行的对象的简单示例一些在不同线程上工作:
#include <iostream>
#include <random>
#include <thread>
struct Foo
{
int count;
void Bar (int n)
{
count = 0;
for (int i = 0; i < n; ++i)
count += std::rand() % n;
}
};
void SetUpMultiThreading (std::vector<Foo> & foo)
{
int n = foo.size();
std::vector<std::thread> threads(n);
// the below (2*i+5) is just some mock data input
for (int i = 0; i < n; ++i)
threads[i] = std::thread(&Foo::Bar, std::ref(foo[i]), 2*i+5);
// Note that without std::ref (or a custom wrapper instead)
// then the foo element would be copied to the std::thread
// function, so you'd lose access to the results
for (auto & t : threads)
t.join();
}
void CheckWork (const std::vector<Foo> & foo)
{
for (auto & f : foo)
std::cout << f.count << std::endl;
}
int main ()
{
srand(time(NULL));
const int n = 8;
std::vector<Foo> foo(n);
SetUpMultiThreading(foo);
CheckWork(foo);
}