0

我想使用这个 Pthread API 修改 Linux 操作系统上的多线程程序。

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

int sum;
void *runner(void *param);

int main(int argc, char *argv[]) {
    pthread_t tid
        pthread_attr_t attr;

    if (argc != 2) {
        fprintf(stderr, "usage: a.out <integer value>\n");
        return -1;
    }
    if (atoi(argv[1]) < 0) {
        fprintf(stderr, "%d must be >=0\n", atoi(argv[1]));
        return -1;
    }

    pthread_attr_init(&attr);
    pthread_create(&tid, &attr, runner, argv[1]);
    pthread_join(tid, NULL);

    printf("sum = %d\n", sum);
}

void *runner(void *param);
{
    int i, upper = atoi(param);
    sum = 0;

    for (i = 1; i <= upper; i++)
        sum += i;

    pthread exit(0);
}

我想将该程序更改为具有2 个线程的程序,这些线程一起工作以添加一个数字。但是我不知道如何更改它,再次感谢您提供的任何帮助。对不起,因为我不善于解释。

4

2 回答 2

1

首先有 3 个错误:pthread tid声明没有“;”,然后在runner()*函数声明的末尾有一个错误,最后但并非最不重要的是,最后一行缺少下划线pthread_exit(0) 当心啊哈

好的 vars :

    pthread_t tid;
    pthread_t tid2;
    pthread_attr_t attr;
    pthread_attr_t attr2;

并在 ifs 之后的代码中添加:

pthread_attr_init(&attr);
pthread_attr_init(&attr2);
pthread_create(&tid, &attr, runner, argv[1]);
pthread_create(&tid2, &attr2, runner, argv[2]); // not sure for argv[2]?

不确定 argv[2],这取决于它是否是 2 个不同的数字?

pthread_join 没有用,它们在这里仅用于暂停线程,我认为如果您希望它们并行工作,您只需要执行“pthread_create”并且它们应该并行工作(但我在并行的 CS 课上看到了3 年前编程,它永远不会是“真正的真正”并行,因为只有操作系统可以控制它,你需要成为某种超级根才能真正控制线程

我的意思是它不会更快,因为它不会是真正的并行程序

于 2019-02-25T03:54:43.500 回答
0

我不确定你想要什么,但下面是一个基于现有代码的快速而肮脏的解决方案。我假设您只希望两个线程将单个变量与输入相加。

对正在发生的事情的解释:我必须修复代码中的一些小语​​法问题,其中一个大问题是运行器函数定义末尾的分号。我添加了一个互斥体来定义跑步者 for 循环中的关键部分。它确保只有 1 个线程可以更新总和。我假设您希望总和等于输入,所以我们只需将其递增 1 并在递增之前检查该值是否仍低于该值。就像我说的,它又快又脏,并不是真正的理想解决方案。要创建两个线程,我们只需在 main 中调用线程创建函数两次。

有关互斥锁和 pthread 库的更多重要信息,请参阅https://computing.llnl.gov/tutorials/pthreads/#Mutexes

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

int sum = 0; // set it once globally
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
void *runner(void *param);

int main(int argc, char *argv[]) {
    pthread_t tid1, tid2;
    pthread_attr_t attr;

    if (argc != 2) {
        fprintf(stderr, "usage: a.out <integer value>\n");
        return -1;
    }
    if (atoi(argv[1]) < 0) {
        fprintf(stderr, "%d must be >=0\n", atoi(argv[1]));
        return -1;
    }

    pthread_attr_init(&attr);
    pthread_create(&tid1, &attr, runner, argv[1]);
    pthread_create(&tid2, &attr, runner, argv[1]);
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    printf("sum = %d\n", sum);
}

void *runner(void *param) {
    int i, upper = atoi(param);
    // sum = 0;

    int t = pthread_self();

    for (i = 1; i <= upper; i++) {
        pthread_mutex_lock(&mtx);
        if (sum < upper) {
            printf("%d incrementing\n", t);
            sum += 1;
        }
        pthread_mutex_unlock(&mtx);
    }

    pthread_exit(0);
}

用 编译cc -o main main.c -pthread

于 2019-02-25T03:52:44.327 回答