#include #include #include #include #include #define NTHREADS 16 #ifndef NULL #define NULL (void *)0 #endif typedef struct { char header[20]; int count; int data[1000]; } accumul; typedef struct { int threadNum; } threadInfo; accumul perfect; accumul minusone; accumul plusone; int N = 5; _Atomic long curr = ATOMIC_VAR_INIT(0); pthread_mutex_t mutexAV; void addValue(accumul *addTo, int val) { pthread_mutex_lock(&mutexAV); addTo->data[addTo->count++] = val; pthread_mutex_unlock(&mutexAV); } void pres(accumul* dat) { printf("%s %d\n", dat->header, dat->count); for (int i = 0; i < dat->count; i++) printf(" %2d %d\n", i, dat->data[i]); } void* checkit(void * args) { threadInfo *tInfo = args; while (1) { long val = curr++; if (val % 1000000 == 0) printf("Thread:%2d number:%10ld\n", tInfo->threadNum, val); if (val > N) break; int j = sqrt(val); int sm = 1; for (int k = 2; k <= j; k++) { int div = val / k; if (k * div == val) { sm += k; if (k != div) sm += div; } } //printf("%d %d\n", val, sm); if (sm == val) { addValue(&perfect, val); } if (sm==(val-1)) { addValue(&minusone, val); } if (sm==(val+1)) { addValue(&plusone, val); } } return NULL; } int main(int argc, char const *argv[]) { pthread_mutex_init(&mutexAV, NULL); perfect.count = 0; sprintf(perfect.header, "perfect"); plusone.count = 0; sprintf(plusone.header, "plusone"); minusone.count = 0; sprintf(minusone.header, "minusone"); N = atoi(argv[1]); curr = 0; pthread_t threads[NTHREADS]; threadInfo tInfo[NTHREADS]; for (int i = 0; i < NTHREADS; i++) { tInfo[i] = (threadInfo){.threadNum = i}; pthread_create(threads + i, NULL, checkit, &tInfo[i]); } for (int i = 0; i < NTHREADS; i++) { pthread_join(threads[i], NULL); printf("Joined %d\n", i); } pres(&perfect); pres(&minusone); pres(&plusone); return 0; }