Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 07_02_InterlockedCompareExchange

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
1.32 Кб
Скачать
#include <windows.h>
#include <iostream.h>

volatile long n;

void producer()
{
  long goods = 0;
  for (;;)
  {
    ++goods;   // производим новое число
  // помещаем число в контейнер, если он пустой
    InterlockedCompareExchange((PVOID*)&n, (PVOID)goods, 0);
    Sleep(150);
  }
}

void consumer()
{
  long goods;
  for (;;)
  {
    Sleep(400);
    goods = n;  // извлекаем число из контейнера
    InterlockedExchange((LONG*)&n, 0);  // отмечаем, что контейнер пустой
    cout << "Goods are consumed: " << goods << endl;
  }
}

int main()
{
  HANDLE   hThread_p, hThread_c;
  DWORD  IDThread_p, IDThread_c;
  
  cout << "Press any key to terminate threads." << endl;
  // создаем потоки
  hThread_p = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)producer,
                           NULL, 0, &IDThread_p);
  if (hThread_p == NULL)
    return GetLastError();
  hThread_c = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)consumer, 
                           NULL, 0, &IDThread_c);
  if (hThread_c == NULL)
    return GetLastError();
  
  cin.get();
  
  // прерываем выполнение потоков
  TerminateThread(hThread_p, 0);
  TerminateThread(hThread_c, 0);
  
  // закрываем дескрипторы потоков
  CloseHandle(hThread_c);
  CloseHandle(hThread_p);
  
  return 0;
}
Соседние файлы в папке Листинги