Mic*_*ick 5 c++ multithreading visual-studio-2008 visual-studio
我有很多结构,例如:
typedef struct
{
int a;
int b;
int c;
etc...
}
data_type;
data_type data[100000];
Run Code Online (Sandbox Code Playgroud)
我有一堆单独的线程,每个线程都想对data []中的元素进行更改。我需要确保没有线程尝试同时访问相同的数据元素。准确地说:一个线程执行数据[475] .a = 3;另一个线程执行data [475] .b = 7; 不允许同时执行,但一个线程执行数据[475] .a = 3; 而另一个线程执行data [476] .a = 7; 被允许。该程序对速度至关重要。我的计划是为每个数据元素创建一个单独的关键部分,如下所示:
typedef struct
{
CRITICAL_SECTION critsec;
int a;
int b;
int c;
etc...
}
data_type;
Run Code Online (Sandbox Code Playgroud)
从某种意义上说,我认为它应该都能正常工作,而且我应该没有真正的问题,但是我对多线程编程没有太多的经验,我对拥有如此多的关键部分感到有些不安。我想知道它们的纯粹数量是否会造成某种效率低下。我也想知道其他一些多线程技术是否可能更快?我应该放松一下并继续执行计划A吗?
有了这么多对象,它们的大部分关键部分都将被解锁,并且几乎不会出现争用。正如您已经知道的(其他评论),如果关键部分是无主的,则不需要内核模式转换。这使得关键部分在这种情况下变得高效。
唯一的其他考虑因素是您是否希望将关键部分放在对象内或另一个数组中。引用局部性是将关键部分放入对象内部的一个很好的理由。当您进入临界区时,整个高速缓存行(例如 16 或 32 字节)将位于内存中。通过一些填充,您可以确保每个对象都在缓存行上启动。因此,一旦进入其临界区,该对象将(部分)位于缓存中。
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |