c++ - 大量关键部分有任何问题吗?

标签 c++ visual-studio visual-studio-2008 multithreading

我有大量的结构,像这样:

typedef struct
{
    int a;
    int b;
    int c;
    etc...
}
data_type;

data_type data[100000];

我有一堆独立的线程,每个线程都想对 data[] 中的元素进行更改。我需要确保没有线程尝试同时访问相同的数据元素。准确地说:一个线程执行 data[475].a = 3;另一个线程执行 data[475].b = 7;不允许同时执行,但一个线程执行 data[475].a = 3;而另一个线程执行 data[476].a = 7;被允许。该程序对速度高度至关重要。我的计划是为每个数据元素创建一个单独的关键部分,如下所示:

typedef struct
{
    CRITICAL_SECTION critsec;
    int a;
    int b;
    int c;
    etc...
}
data_type;

从某种意义上说,我想它应该都能正常工作,我应该没有真正的问题,但在多线程编程方面没有太多经验,我只是对有这么多关键部分感到有点不安。我想知道它们的数量是否会造成某种低效率。我还想知道其他一些多线程技术是否可以更快?我应该放松一下并继续执行 A 计划吗?

最佳答案

有了这么多的对象,它们的大部分临界区都会被解锁,几乎不会有争用。正如您已经知道的(其他评论),如果关键部分是无主的,则不需要内核模式转换。这使得关键部分在这种情况下变得高效。

唯一的其他考虑因素是您是否希望将关键部分放在对象内部或另一个数组中。引用的局部性是将关键部分放在对象内部的一个很好的理由。当您进入关键部分时,整个缓存行(例如 16 或 32 字节)将在内存中。通过一些填充,您可以确保每个对象都从缓存行开始。因此,一旦进入临界区,对象将(部分)在缓存中。

关于c++ - 大量关键部分有任何问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1666537/

相关文章:

visual-studio - 在当前正在执行的代码行上停止调试器

asp.net-mvc - 命令行到 "deploy"ASP.NET MVC 项目

c++ - 读者作家 - 作家线程总是卡在多个读者线程中

c++ - 在多个键下将项目存储在 map 中

c++ - 如何正确声明模板类的嵌套类的友元?

visual-studio - silverlight 中 CodeFile.cs 和 Class.cs 的区别

c++ - 如何增加 Visual Studio 中的错误限制?

c++ - Visual Studio Code 智能感知,使用 g++ 预定义的宏

c++ - 尝试在 Visual Studio 2013 中使用 sqlite3_open 进行编译时出错

.net - Entity Framework 错误 - "The EntityContainer name must be unique"