Программа 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
,