Я практиковал pthread в C, попробуй разработать функцию, которая как можно более равномерно распределяет нагрузку между потоками. Каждый поток возвращает целое число, представляющее объем работы, который им был назначен.
#include <stdio.h>
#include <pthread.h>
#define THREADS 3
#define ITEMS 10
pthread_mutex_t locker = PTHREAD_MUTEX_INITIALIZER;
void* worker(void* arg){
int id = *(int*)arg;
int chunk = ITEMS/THREADS;
int start = chunk * id;
int end = id == THREADS - 1 ? ITEMS : start + chunk;
for(int i = start; i < end; i ++){
//do some work;
}
pthread_mutex_lock(&locker);
//do some work
pthread_mutex_unlock(&locker);
return end - start; //here return type should be (void *), I casted it to (int).
}
int main(void){
pthread_t ids[THREADS];
int args[THREADS];
for(int i = 0; i < THREADS; i ++){
args[i] = i;
pthread_create(ids + i,NULL,worker,&args[i]);
}
int total = 0;
int temp;
for(int i = 0; i < THREADS; i ++){
pthread_join(ids[i],&temp); //param here should be (void**), I cast it to (int*)
total = total + temp;
printf("Thread %d process %d items\n",i,temp);
}
printf("Get total items:%d\n",total);
}
Я хочу суммировать возвращаемое значение из каждого потока, чтобы проверить, был ли обработан весь элемент. Поскольку я ленив, и это была лишь небольшая практика, я напрямую приводил возвращаемое значение каждого потока из (void *)
в (int)
. Затем я получил некоторый вывод, который меня действительно смутил. Оказывается, я могу успешно прочитать значение из переменной «temp», но когда я попытался сделать
total = total + temp;
значение total
не изменилось... Я решил проблему, изменив тип temp с int
на long
, но я не понимаю, почему здесь важно количество байтов, находящихся в памяти.
Вот пример вывода
Thread 0 process 3 items
Thread 1 process 3 items
Thread 2 process 4 items
Get total items:4
PS: я знаю, как правильно это сделать. Чего я не понимаю, так это того, что происходит, когда я приводил целое число к указателю, а затем сохранял его в 4-байтовой памяти? Почему значение может быть распечатано, но не может быть вычислено с ним? В чем причина, если я использую long (тот же размер, что и void *) вместо int (4 байта памяти), то все работает нормально?
int temp;
должна быть:int *temp = NULL;
и эта строка:total = total + temp;
лучше было бы написать как:total = total + *temp;
- person user3629249   schedule 22.05.2017int chunk = ITEMS/THREADS;
выполняет целочисленное деление. Это заявление имеет несколько проблем. Одна вопиющая проблема заключается в том, что еслиTHREADS
больше, чемITEMS
, то результатом вычисления будет 0. Вероятно, это не то, что вам нужно. - person user3629249   schedule 22.05.2017return end - start;
Существует лучший способ выхода из функций потока. Предложить:int result = end-start; pthread_exit( (void*)&result );
- person user3629249   schedule 22.05.2017pthread_create()
всегда проверяйте возвращаемое значение, чтобы убедиться, что операция прошла успешно. т.е. if( 0 != pthread_create(...)) { perror( pthread_create не удалось); } - person user3629249   schedule 22.05.2017