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

标签 c multithreading pthreads parameter-passing

我对 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/

相关文章:

java - 无法在Thread中获取spring服务bean

java - 如何在 Java 中并行化循环

c++ - 线程同步 - 微妙的问题

linux - 正确使用在进程间共享的 pthread mutex

c - 使用 Malloc 输入字符串后程序崩溃

c - 为什么我们需要指向结构体的指针来改变成员值?

c++ - 错误处理语句是如何格式化的?

c - 当字符串的长度大于 n 时,如何打印字符串的前 n 个字节?

c - 线程缓冲区 : how to prevent racing between clients and have client and server working on buffer simultaneously

c - 无法将线程策略更改为 SCHED_FIFO