Программа Thread в Linux (Тема Posix)

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

#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 ответа

Решение

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

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

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

Объяснение того, что происходит: мне пришлось исправить некоторые незначительные синтаксические проблемы, которые у вас есть в вашем коде, одна большая - точка с запятой в конце определения функции бегуна. Я добавил мьютекс, чтобы определить критическую секцию в цикле для бегуна. Это гарантирует, что только 1 поток может обновить сумму. Я предполагаю, что вы хотите, чтобы сумма равнялась входному значению, поэтому мы просто увеличиваем ее на 1 и проверяем перед приращением, является ли значение все еще ниже. Как я уже сказал, это довольно быстро и грязно, не совсем идеальное решение. Чтобы создать два потока, мы просто вызываем функцию создания потока дважды в main.

См. https://computing.llnl.gov/tutorials/pthreads/, чтобы узнать больше о мьютексах и библиотеке pthread.

#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,

Другие вопросы по тегам