#include #include #include #include #include #define N_THREADS 1 #define N_STEPS 200 #define N_NUMBERS_CALCULATED 100000 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; pthread_spinlock_t alive_threads_lock; pthread_spinlock_t produced_numbers_lock; int amicable_numbers[N_NUMBERS_CALCULATED]; long produced = 0; int threads_alive = 0; int calculate_amicable_number(int number) { for(int i=1; i< number; i++){ if(number % i == 0){ number = number + i; } } return number; } void *calculate_amicable_number_invterval(void * arg) { int *myrank = (int *)arg; long mystart = (int)(N_NUMBERS_CALCULATED/ (double)N_THREADS * *myrank); long myend = (int)(N_NUMBERS_CALCULATED / (double)N_THREADS * (*myrank + 1)); for(int i = mystart; i < myend; i++) { amicable_numbers[i] = calculate_amicable_number(i); } return NULL; } int not_all_numbers_calculated() { int ret = 0; pthread_spin_lock(&produced_numbers_lock); if(produced < N_NUMBERS_CALCULATED) ret = 1; pthread_spin_unlock(&produced_numbers_lock); return ret; } int is_there_space_for_new_thread() { int ret = 0; pthread_spin_lock(&alive_threads_lock); if (threads_alive < N_THREADS) ret = 1; pthread_spin_unlock(&alive_threads_lock); return ret; } int main() { pthread_spin_init(&alive_threads_lock, PTHREAD_PROCESS_PRIVATE); pthread_spin_init(&produced_numbers_lock, PTHREAD_PROCESS_PRIVATE); pthread_t t[N_THREADS]; int p[N_THREADS]; double dt = omp_get_wtime(); for (int i = 0; i