Arrays C中多线程的数组组织/数据结构

Arrays C中多线程的数组组织/数据结构,arrays,c,multithreading,Arrays,C,Multithreading,我想在程序中添加多线程,这样我就可以通过运行两个或多个并发进程来加快任务的执行速度 下面是代码的概要(没有多线程) double*a、*b、*c、*d; int n=10000; int i,j; a=(doube*)calloc(n,sizeof(double)); b=(doube*)calloc(n,sizeof(double)); c=(doube*)calloc(n,sizeof(double)); d=(doube*)calloc(n,sizeof(double)); 设置(a,b)

我想在程序中添加多线程,这样我就可以通过运行两个或多个并发进程来加快任务的执行速度

下面是代码的概要(没有多线程)

double*a、*b、*c、*d;
int n=10000;
int i,j;
a=(doube*)calloc(n,sizeof(double));
b=(doube*)calloc(n,sizeof(double));
c=(doube*)calloc(n,sizeof(double));
d=(doube*)calloc(n,sizeof(double));
设置(a,b)//设置数组a和b的初始值的例程
因为(i=0;i[2]可能是最好的

多线程对同一对象的非同步写入或写入和读取是一种数据竞争,这会导致未定义的行为。可以添加锁定或原子性来避免这种情况,但通常会慢得多。因此[1]不可接受。即使线程访问阵列中不同但相邻的元素,也可能会由于缓存线乒乓而导致速度减慢


但是,让多个线程同时读取同一对象没有问题,只要没有人在写入。事实上,最好只读取对象的一个副本;这样可以节省内存和缓存空间。因此[2]比[3]更高效。

让多个线程读取同一数据(只要不写入)这不是问题

如果一个线程负责更新
c
,另一个线程负责更新
d
,那么您也不必担心写操作

因此,一个线程有一个嵌套循环,负责
c
,另一个线程有自己的嵌套循环,负责
d
。由于每个线程都在编写不同的数据集,因此不必担心同步它们


如果你这样做,[1]很好。

非常感谢,,…代码的大纲是一个简化…
a,b
带索引
i,j
被发送到一个函数以及带索引
i,j
c,d
的指针,因为同时计算
c,d
是最有效的……因此我可以看到你答案的逻辑[1]根据最初提出的问题可以,但您已经提供了足够的信息,以明确[2]将是最好的。谢谢你清晰的回答。你的答案和@NateEldredge的答案都在1分钟内发布,加上你们两人都写了非常清晰的答案。在多次刷新此页面后,我现在可以看到Nate刚刚发布了第一条消息-因此我将接受Nate的答案-但我会很高兴我也很高兴接受你的答案-很抱歉,我只能接受一个,我决定使用第一个发布的答案,尽管时间差不到一分钟。感谢你明确的回答和关于“数据竞赛”的警告。
double * a, *b, *c, *d; 
int n=10000;
int i, j;
a=(doube *)calloc(n, sizeof(double)); 
b=(doube *)calloc(n, sizeof(double)); 
c=(doube *)calloc(n, sizeof(double)); 
d=(doube *)calloc(n, sizeof(double)); 

setup(a, b); //routine to set the inital values of arrays a and b 

for (i=0; i<n; i++)
{
  for (j=0; j<n; j++)
  {
    if (i==j) continue;
    c[i]+=func(a[i],a[j]);   //calculation functions 
    d[j]+=func2(b[i],b[j]);
  }
}