c++ - 转换旧的 C 代码以使用线程

标签 c++ multithreading

我有一个非常古老、非常大、功能齐全的 C 程序,可以玩棋盘游戏。我想将它(或者我应该说它的一部分)转换为在多线程中工作,这样我就可以利用多核处理器。在旧程序中有一个名为 board[] 的全局 UBYTE 数组。有很多(高度优化、高度关键的)函数可以操纵 board[] 的内容。我现在想让这个过程按如下方式工作:

步骤 1. 执行大量 单线程操作 执行许多操作 单板[]。这些都是太复杂而无法在多核上执行的事情。

第 2 步. 外包 “board[]”的多个拷贝到 线程的集合,并且每个都有 线程花一些时间做他们的 自己单独操作他们的 拥有私有(private)的“board[]”。

第 3 步。 线程完成他们的工作并且 返回一些主要的答案 线程。

为了论证,我们假设将有 32 个子线程。

现在实现此目的的一种方法是制作一个全局板[]和 32 个具有不同名称的子板,例如 sub_board[32][],然后编写一组新的板操作函数来处理新的 2 dimensional sub_board[][],但这会破坏我的优化,因为每次访问游戏板都需要额外的乘法和加法。此外,旧板操作功能的新版本会稍微困惑一些。

现在我以前不是 C++ 程序员(但我正在尽可能快地学习)并且有人建议了以下涉及 C++ 的技巧(我不确定我是否掌握了所有细节):我将现有的 board[] 保持原样。我保留所有现有的板操作功能。我创建了一个新类(我们称之为 thread_type),其中包含一个板 [] 和一组新的板操作函数。像这样:

class thread_type 
{
    UBYTE board[]; // boards for slave threads to work with
    void board_manipulation_A(void);
    void board_manipulation_B(void);
}

板操作函数与旧函数相同(因此我可以剪切和粘贴),除了在开始时用“thread_type::”声明。然后在 main() 中我有:

class thread_type slave[32];

现在我可以在基本线程中使用我所有的旧代码来操作一个全局 board[]。然后我可以将主板[]复制到slave[n].board[]然后有

For (i = 0; i < 32;i++)
{
    // there will have to be some extra thread/mutex 
    // related code around here but I'm not showing it for simplicity

    slave[n].do_your_stuff(); 
}

现在在 32 个线程中的每一个线程中,每个线程都将使用与旧的原始(完全调试和优化)代码几乎相同的代码在自己不同的“board[]”上工作。我什至可以通过一些#define 技巧来完全避免旧代码的剪切和过去,即将函数声明写成这样

void THREAD_OR_BASE board_manipulation_A(void);

然后运行一次

#define THREAD_OR_BASE // zilch

和一次

#define THREAD_OR_BASE thread_type::

这样我就可以非常确定,每当我对 board_manipulation_A() 进行修改时,它都会同时出现在基本线程版本和子线程版本中。

我的问题是:A) 这一切都能奏效吗? B)我错过了一些重要的步骤吗? C) 我可以用一些更简单的方法达到同样的目的吗?

编辑:而不是 32 个线程,我应该说“有多少线程就有多少内核”

最佳答案

如果你不需要将线程结果板合并回同一个,在我看来是一个很好的策略,让每个线程都有自己的板拷贝并处理它,我不明白为什么不应该工作。

但是,在我看来线程会执行很多 cpu 绑定(bind)操作,如果那是真的,你不应该有那么多线程,最好有与你的 cpu 核心相同的线程或更多线程,如果更多,它们将争夺 cpu 资源,并且您的性能将下降。

关于c++ - 转换旧的 C 代码以使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1438053/

相关文章:

java - 如何从tomcat自动获取线程转储

sockets - 套接字:I/O错误32

java - 同步与读写锁

c++ - Boost Spirit Qi 语法用于合成关联二元运算符 AST 节点?

c# - C#中如何跨线程调用BindingList<T>

java - for循环生成的多线程不能使用synchronized吗?

c++ - 模板模板类谓词在部分特化中不起作用

Java 互斥体与条件变量的关联

c++如何确保我的函数在被杀死之前完全执行

c++ - 在 C++ 中正确处理来自 argv 的字符串中的转义序列