Программа Thread в Linux (Тема Posix) - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу изменить многопоточную программу в операционной системе Linux с помощью этого API-интерфейса Pthread.

#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 потока, которые работают вместе, чтобы добавитьчисло .Но я не знаю, как это изменить, еще раз спасибо за любую помощь, которая может быть предложена.Прошу прощения, потому что не умею объяснять.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

сначала есть 3 ошибки: в объявлении pthread tid нет ";", затем в конце объявления функции runner()* есть одна, и, наконец, в последней строке отсутствует подчеркивание pthread_exit(0) остерегайтесь ахах

нормально для переменных:

    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 года назад, он никогда не будет «реально-реальным» параллельным, потому что только ОС может управлять этим, и вам нужно быть своего рода супер-рутом, чтобы иметь возможностьреально контролировать потоки

Я имею в виду, что это не будет быстрее, потому что это не будет настоящей параллельной прогой

0 голосов
/ 25 февраля 2019

Я не совсем уверен, что вы хотите, но очень быстрое и грязное решение на основе существующего кода ниже.Я предполагаю, что вы просто хотите, чтобы два потока суммировали одну переменную с входными данными.

Объяснение того, что происходит: мне пришлось исправить некоторые незначительные синтаксические проблемы, которые у вас есть в коде, один большой из которых былточка с запятой в конце определения функции бегуна.Я добавил мьютекс, чтобы определить критическую секцию в цикле для бегуна.Это гарантирует, что только 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.

...