Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多线程每次操作的平均成本_C_Multithreading - Fatal编程技术网

C 多线程每次操作的平均成本

C 多线程每次操作的平均成本,c,multithreading,C,Multithreading,我正在学习用c编写多线程程序,我刚刚注意到,当我增加给定线程的迭代次数时,每个操作的成本就会下降 例如,如果我有两个线程,每个线程向一个全局变量添加一个数字,然后减去相同的数字,如果每个线程执行1000次,那么与每个线程执行1000000次相比,每个操作的成本要高得多。为什么会这样 static int num_iterations = 1; int opt_yield=0; void add(long long *pointer, long long value) {

我正在学习用c编写多线程程序,我刚刚注意到,当我增加给定线程的迭代次数时,每个操作的成本就会下降

例如,如果我有两个线程,每个线程向一个全局变量添加一个数字,然后减去相同的数字,如果每个线程执行1000次,那么与每个线程执行1000000次相比,每个操作的成本要高得多。为什么会这样

static int num_iterations = 1;
int opt_yield=0;

    void add(long long *pointer, long long value) {
        long long sum = *pointer + value;
        if (opt_yield)
            pthread_yield();
        *pointer = sum;
    }


struct arg_struct {
  long long counter;
  long long value;
};



void *aux_add(void *arguments)
{

  struct arg_struct *args = arguments;
  int i=0;
  for (i=0;i<num_iterations;i++)
  {
    args->value = 1;
    add(&args->counter,args->value);
    args->value = -1;
    add(&args->counter,args->value);
  }
}


int main(int argc, char * argv[])
{
  printf("\n\n");
  int num_threads = 2;

  pthread_t t[num_threads];


struct arg_struct args;
args.counter = 0;



int count=0;
for(count=0;count<num_threads;count++)
{
  if( pthread_create(&threads[count],NULL,&aux_add, (void *) &args) !=0)
    exit();
}



for(count=0;count<num_threads;count++)
{
  pthread_join(threads[count], NULL);
}


  return 0;
}
static int num_iterations=1;
int opt_收益率=0;
void add(长*指针,长值){
长和=*指针+值;
如果(选择产量)
pthread_yield();
*指针=和;
}
结构arg_结构{
长计数器;
长期价值;
};
void*辅助添加(void*参数)
{
struct arg_struct*args=参数;
int i=0;
对于(i=0;ivalue=1;
添加(&args->counter,args->value);
args->value=-1;
添加(&args->counter,args->value);
}
}
int main(int argc,char*argv[])
{
printf(“\n\n”);
int num_线程=2;
pthread_t t[num_threads];
结构arg_结构args;
args.counter=0;
整数计数=0;

对于(count=0;count,这仅仅是因为线程的创建和销毁不是免费的——它会占用操作系统的开销。线程实际工作的时间越长,与开销的关系就越小(这是恒定的)应用于您的总体运行时间。

每个线程是否更改自己的gloabl变量,还是使用相同的全局变量?是否使用一些同步对象(如互斥)?或者你的全局变量是原子类型的?你能发布你的代码吗?请展示你用来测试这个的代码。我现在没有使用任何同步方法,因为我的目标实际上是调查竞争条件并了解它们是如何工作的。好的。请展示你用来测试这个的代码。你看,问题是,我们得到了许多学生将他们的家庭作业问题重新表述成一种形式,表明他们确实看到了一些问题或问题。然后他们寻求帮助/解释,希望撰稿人能写出他们的全部家庭作业答案。投票圈成员也有一个问题,他们“播种”了众所周知的、容易回答的答案,问题供他们的朋友填写以进行投票。我确信您不希望被视为属于此类不道德的恶棍,因此请发布用于计时线程操作的代码:)