gpt4 book ai didi

c - 将参数传递给线程但得到的结果与预期完全不同

转载 作者:行者123 更新时间:2023-11-30 16:56:08 25 4
gpt4 key购买 nike

我对 C 完全陌生,所以请原谅我缺乏知识。我试图创建 4 个线程,每个线程分别生成 100-199 200-299 300-399 和 400-499 之间的数字。然而,当我传递参数 interv(一个具有两个 int 值的结构类型)时,我在另一边得到了完全不同的东西。例如,当我发送 100 和 199 时,我得到 0 而不是 199,得到 -13216 而不是 100。我不确定问题到底出在哪里,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define NUM_THREADS 4
int sum; /* global variable shared by thread(s) */
pthread_mutex_t counter_lock = PTHREAD_MUTEX_INITIALIZER;


int cmpfunc (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}

typedef struct interval {
int min;
int max;
} interval;

void *runner(struct interval *param); /* threads call this function */
/*
*
*/
int main(int argc, char *argv[]) {
pthread_t workers[NUM_THREADS];
interval *interv;
interv->max = 199;
interv->min = 100;
/* create the thread */
printf("min = %d max = %d \n",interv->min,interv->max);
for (int i = 0; i < NUM_THREADS; i++) {
printf("min = %d max = %d \n",interv->min,interv->max);
pthread_create(&workers[i],NULL,runner,&interv);
interv->min += 100;
interv->max += 100;
/* wait for the thread to exit */
pthread_join(&workers[i],NULL);
}
printf("sum = %d\n",sum);
return (0);
}

/* The thread will begin control in this function */
void *runner(struct interval *param) {
int n, array[100], list_sum, counter;
printf("min = %d max = %d \n",param->min,param->max);
for (int i; i < 100; i++) {
n = rand() % (param->max + 1 - param->min) + param->min;
array[i] = n;
list_sum += n;
}
qsort(array, 100, sizeof(int), cmpfunc);
for (int i; i < 100; i++) {
counter += 1;
if (counter == 10) {
counter = 0;
}
}
pthread_mutex_lock(&counter_lock);
sum += list_sum;
pthread_mutex_unlock(&counter_lock);
pthread_exit(0);
}

更新:所以程序编译时我没有得到我预期的结果,所以我重写了大部分代码。尽管现在我再次遇到一些奇怪的行为,但我不确定为什么。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define NUM_THREADS 1
#define NUM_ELEMENTS 10
//Sum computed buy the background thread
int total = 0;
int counter = 0;

struct sum_runner_struct {
int min;
int max;
int array[NUM_ELEMENTS];
int answer;
};

//Thread function to generate a sum of 0 to N
void* runner(void* arg) {
struct sum_runner_struct *arg_struct = (struct sum_runner_struct*) arg;
int n, sum;
for (int i = 0; i<NUM_ELEMENTS; i++) {
n = rand()%(arg_struct->max + 1 - arg_struct->min) + arg_struct->min;
printf("%d ",n);
arg_struct->array[i] = n;
}
printf("\n");
for (int i = 0; i<NUM_ELEMENTS; i++) {
sum = sum + arg_struct->array[i];
printf("%d ", arg_struct->array[i]);
counter += 1;
if (counter == 10) {
printf("\n");
counter = 0;
}
}
printf("Sum: %d\n",sum);
arg_struct->answer = sum;
pthread_exit(0);
}

int main(int argc, char **argv) {
int INTERVALS[4][2] = {{100,199},{200,299},{300,399},{400,499}};
struct sum_runner_struct args[NUM_THREADS];

// Launch threads
pthread_t tids[NUM_THREADS];

for (int i = 0; i < NUM_THREADS; i++) {
args[i].min = INTERVALS[i][0];
args[i].max = INTERVALS[i][1];
//Create attributes
pthread_attr_t attr;
pthread_attr_init(&attr);

//Create Thread
pthread_create(&tids[i], &attr, runner, &args[i]);

}

//Wait until thread is done its work
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(tids[i], NULL);
printf("Sum of thread %d is %d\n", i, args[i].answer);
total += args[i].answer;
}
printf("Sum is %d\n", total);
}

在您评论我的随机数生成器之前,我知道这不是目前最好的解决方案,但这不是我的问题。我的问题是,当我添加线程数组中的数字时,我得到的数字比 6 个整数大。我不知道为什么会发生这种情况。

例如,当我使用单线程运行程序来生成 10 个元素时,我会得到如下内容:

133 143 162 129 100 108 152 156 156 119 
133 143 162 129 100 108 152 156 156 119
Sum: 1364
Sum of thread 0 is 1364
Sum is 1364

RUN SUCCESSFUL (total time: 57ms)

请注意,我将数组打印了两次,因此为什么同一数组有两行。正如你所看到的(我认为我把它们加起来是正确的),如果你将数组中的数字相加,你会得到 1358,而不是 1364。我不确定是什么原因导致的。

最佳答案

好吧,我发现了这个问题,我不确定到底为什么,但是当我初始化时 整数n,总和;由于某种原因总和值被初始化为 6。谁能解释为什么会发生这种情况?

关于c - 将参数传递给线程但得到的结果与预期完全不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40042382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com