Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <pthread.h>
  5. #include <stdbool.h>
  6. #include <values.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9.  
  10. struct Parameters {
  11. int left;
  12. int right;
  13. int size;
  14. int *max_printed_number;
  15. int *amount_of_working_threads;
  16. };
  17.  
  18.  
  19. const int max_memory_size = 100000;
  20. const int limit = INT_MAX - 1;
  21. const int retries = 1;
  22.  
  23.  
  24. int min(int a, int b) {
  25. if (a < b) {
  26. return a;
  27. }
  28. return b;
  29. }
  30.  
  31.  
  32. int max(int a, int b) {
  33. if (a < b) {
  34. return b;
  35. }
  36. return a;
  37. }
  38.  
  39.  
  40. int myCeil(int numerator, int denominator) {
  41. return (numerator - 1) / denominator + 1;
  42. }
  43.  
  44.  
  45. void * eratosphen_iteration(void* vp) {
  46. struct Parameters* p = (struct Parameters*)vp;
  47. int segment_size = p->right - p->left + 1;
  48. bool* new_segment = (bool*) malloc(sizeof(bool) * segment_size);
  49. // за число k отвечает индекс k - p->left;
  50. for (int i = 0; i < segment_size; ++i) {
  51. new_segment[i] = true;
  52. }
  53. int j = 0;
  54. for (int i = 2; i * i <= p->size; ++i) {
  55. j = myCeil(p->left, i) * i - p->left;
  56. for (; j <= segment_size; j += i) {
  57. if (j + p->left != i) {
  58. new_segment[j] = false;
  59. }
  60. }
  61. }
  62. printf("With %d-start thread is waiting on 1 place\n", p->left);
  63. while ((*(p->max_printed_number)) + 1 != p->left) {
  64. //wait
  65. if (p->left != 51) {
  66. printf("With %d-start thread is waiting\n", p->left);
  67. }
  68. }
  69. printf("With %d-start thread is ready\n", p->left);
  70. for (int i = 0; i < segment_size; ++i) {
  71. if (new_segment[i]) {
  72. printf("%d\n", i + p->left);
  73. }
  74. }
  75. free(new_segment);
  76. *(p->max_printed_number) = p->right;
  77. (*(p->amount_of_working_threads))--;
  78. }
  79.  
  80. //Есть проблема, если n < threadsNum
  81. void eratosphenus(int threads_num, int n) {
  82. int max_thread_memory = myCeil(min(max_memory_size, n), threads_num);
  83. pthread_t *threads = (pthread_t *) malloc(sizeof(pthread_t) * myCeil(n, max_thread_memory));
  84. int max_printed_number = 0;
  85. int amount_of_working_threads = 0;
  86. int max_given_number = 0;
  87. int next_max_given_number = 0;
  88. int next_free_thread = 0;
  89. while (max_given_number < n) {
  90. if (amount_of_working_threads < threads_num) {
  91. next_max_given_number = min(max_thread_memory + max_given_number, n);
  92. struct Parameters new_parameter = {max_given_number + 1, next_max_given_number, n, &max_printed_number, &amount_of_working_threads};
  93. printf("created %d thread from %d to %d\n", next_free_thread + 1, new_parameter.left, new_parameter.right);
  94. printf("%p\n", &new_parameter);
  95. //pthread_create(threads + next_free_thread, NULL, eratosphen_iteration, &new_parameter);
  96. pthread_create(threads + next_free_thread, NULL, eratosphen_iteration, (void*)new_parameter); // AZAAZ
  97. amount_of_working_threads++;
  98. next_free_thread++;
  99. max_given_number = next_max_given_number;
  100. }
  101. }
  102. for (int i = 0; i < next_free_thread; ++i) {
  103. pthread_join(threads[i], NULL);
  104. }
  105. free(threads);
  106. }
  107.  
  108.  
  109. int main(int argc, char** argv) {
  110. int n = 0;
  111. if (argc == 2) {
  112. n = limit;
  113. }
  114. else {
  115. n = atoi(argv[2]);
  116. }
  117. //clock_t start, end;
  118. //start = clock();
  119. for (int i = 0; i < retries; ++i) {
  120. eratosphenus(atoi(argv[1]), n);
  121. }
  122. //end = clock();
  123. //printf("%f seconds", (float)(end- start)/retries/CLOCKS_PER_SEC);
  124. return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement