Простой вопрос по модификатору volatile

Тема в разделе "LANGS.C", создана пользователем Ezrah, 30 апр 2011.

  1. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Код (Text):
    1. #define _WIN32_WINNT 0x0500
    2.  
    3. #ifndef UNICODE
    4. #define UNICODE
    5. #endif
    6.  
    7. #ifndef _UNICODE
    8. #define _UNICODE
    9. #endif
    10.  
    11. #include <windows.h>
    12. #include <stdio.h>
    13. #include <wchar.h>
    14.  
    15. #define kCalculationsCount 10
    16. #define kMinN 35
    17. #define kMaxN 45
    18.  
    19. volatile struct Fibonacci {
    20.     int thread_index;
    21.     int n;
    22.     int fib_of_n;
    23.     HANDLE done_event;
    24. };
    25.  
    26. int Calculate(int n) {
    27.     if (n <= 1) return n;
    28.     return Calculate(n - 1) + Calculate(n - 2);
    29. }
    30.  
    31. unsigned int GetLogicalProcessorCount() { return 4; }
    32.  
    33. DWORD WINAPI ThreadPoolCallback(LPVOID thread_context) {
    34.     struct Fibonacci *pf = thread_context;
    35.     wprintf(L"Thread [%d] started calculation of Fibonacci(%d)...\n", pf->thread_index, pf->n);
    36.     pf->fib_of_n = Calculate(pf->n);
    37.     SetEvent(pf->done_event);
    38.     wprintf(L"Thread [%d] finished calculation of Fibonacci(%d)...\n", pf->thread_index, pf->n);
    39.     return 0;
    40. }
    41.  
    42. int wmain() {
    43.     HANDLE done_events[kCalculationsCount];
    44.     struct Fibonacci fibonacci_array[kCalculationsCount];
    45.     int i;
    46.  
    47.     wprintf(L"Launching %d tasks...\n", kCalculationsCount);
    48.  
    49.     for (i = 0; i < kCalculationsCount ; ++i) {
    50.         ULONG queue_flags = WT_EXECUTEDEFAULT;
    51.  
    52.         done_events[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
    53.  
    54.         fibonacci_array[i].thread_index = i;
    55.         fibonacci_array[i].n = kMinN + (rand()*(kMaxN - kMinN))/RAND_MAX;
    56.         fibonacci_array[i].done_event = done_events[i];
    57.  
    58.         WT_SET_MAX_THREADPOOL_THREADS(queue_flags, GetLogicalProcessorCount());
    59.         QueueUserWorkItem(ThreadPoolCallback, &fibonacci_array[i], queue_flags);
    60.     }
    61.  
    62.     WaitForMultipleObjects(kCalculationsCount, done_events, TRUE, INFINITE);
    63.     wprintf(L"All calculations are complete...\n");
    64.  
    65.     for (i = 0; i < kCalculationsCount; ++i) {
    66.         wprintf(L"Fibonacci(%d) = %d\n", fibonacci_array[i].n, fibonacci_array[i].fib_of_n);
    67.     }
    68.  
    69.     for (i = 0; i < kCalculationsCount; ++i) {
    70.         CloseHandle(done_events[i]);
    71.     }
    72.  
    73.     return 0;
    74. }
    Собственно, вопрос: нужен ли модификатор volatile при объявлении сруктуры Fibonacci? Если нет, то нужен ли он где-то в другом месте и почему?
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Тип не может быть volatile. Только переменная может быть volatile.
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Ursus
    тип переменной :)
     
  4. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Ursus
    Т.е. должно быть
    Код (Text):
    1. struct Fibonacci {
    2.     int thread_index;
    3.     int n;
    4.     int fib_of_n;
    5.     HANDLE done_event;
    6. };
    Код (Text):
    1. volatile struct Fibonacci fibonacci_array[kCalculationsCount];
    ?
     
  5. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Вот это ближе к истине.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ezrah
    Не нужен вообще там volatile. Он нужен в специфических случаях для предотвращения некоторых оптимизаций компилятора.
     
  7. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    Хорошо, кажется я понял в каких именно случаях он действительно нужен. В остальном код корректен?
    И в догонку - есть ли ограничение на количество элементов в очереди пула потоков, или количество определяется объемом доступной физической памяти?