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