Advertisement
MarkTiukov

19-0

Apr 5th, 2021
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <limits.h>
  6.  
  7. typedef struct {
  8.     double* array;
  9.     pthread_mutex_t* mutex;
  10.     pthread_t thread;
  11.     size_t n;
  12.     size_t k;
  13.     size_t index;
  14. } context_t;
  15.  
  16. void* func(void* arg) {
  17.     const context_t* ctx = arg;
  18.     const size_t me = ctx->index;
  19.     const size_t left = me == 0 ? ctx->k - 1 : me - 1;
  20.     const size_t right = me == ctx->k - 1 ? 0 : me + 1;
  21.     const double add_left = 0.99;
  22.     const double add_me = 1;
  23.     const double add_right = 1.01;
  24.     for (size_t i = 0; i <ctx->n; ++i) {
  25.         pthread_mutex_lock(ctx->mutex);
  26.         ctx->array[left] += add_left;
  27.         ctx->array[me] += add_me;
  28.         ctx->array[right] += add_right;
  29.         pthread_mutex_unlock(ctx->mutex);
  30.     }
  31.     return 0;
  32. }
  33.  
  34. int main(int argc, char** argv) {
  35.     int n = strtol(argv[1], NULL, 10);
  36.     int k = strtol(argv[2], NULL, 20);
  37.     context_t threads[k];
  38.     double array[k];
  39.     memset(array, 0, sizeof(array));
  40.     pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  41.     pthread_attr_t attr;
  42.     pthread_attr_init(&attr);
  43.     pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN);
  44.     pthread_attr_setguardsize(&attr, 0);
  45.     for (int i = 0; i < k; ++i) {
  46.         threads[i].k = k;
  47.         threads[i].n = n;
  48.         threads[i].index = i;
  49.         threads[i].mutex = &mutex;
  50.         threads[i].array = array;
  51.         pthread_create(&threads[i].thread, &attr, func, &threads[i]);
  52.     }
  53.     pthread_attr_destroy(&attr);
  54.     for (int i = 0; i < k; ++i) {
  55.         pthread_join(threads[i].thread, NULL);
  56.     }
  57.     for (int i = 0; i < k; ++i) {
  58.         printf("%.10g\n", array[i]);
  59.     }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement