// This example based off of samples by Jerry Breecher - http://web.cs.wpi.edu/~jb/CS502/Class_Example_Code.html␍␊ |
#include <stdio.h>␍␊ |
#include <windows.h>␍␊ |
␍␊ |
#define LOOP 999999␍␊ |
␍␊ |
#if !defined(true) && !defined(false)␍␊ |
␉#define true 1␍␊ |
␉#define false 0␍␊ |
#endif␍␊ |
␍␊ |
volatile long gvar = 0;␍␊ |
␍␊ |
volatile int turn;␍␊ |
volatile int flag[2];␍␊ |
␍␊ |
DWORD WINAPI produce(void* data) {␍␊ |
␉int i = 0;␍␊ |
␉flag[0] = true;␍␊ |
␉turn = 1;␍␊ |
␉while (flag[1] && turn == 1);␍␊ |
␉␍␊ |
␉for (i = 0; i < LOOP; i++)␍␊ |
␉␉gvar++;␍␊ |
␍␊ |
␉flag[0] = false;␍␊ |
␍␊ |
}␍␊ |
␍␊ |
DWORD WINAPI consume(void* data) {␍␊ |
␉int i = 0;␍␊ |
␉flag[1] = true;␍␊ |
␉turn = 0;␍␊ |
␉while (flag[0] && turn == 0);␍␊ |
␉for (i = 0; i < LOOP; i++)␍␊ |
␉␉gvar--;␍␊ |
␉flag[1] = false;␍␊ |
}␍␊ |
␍␊ |
int main() {␍␊ |
␉int i;␍␊ |
␉HANDLE thread1, thread2;␍␊ |
␉flag[0] = true;␍␊ |
␉flag[1] = true;␍␊ |
␉␍␊ |
␉thread1 = CreateThread(NULL, 0, produce, NULL, 0, NULL);␍␊ |
␉thread2 = CreateThread(NULL, 0, consume, NULL, 0, NULL);␍␊ |
␉WaitForSingleObject(thread1, INFINITE );␍␊ |
␉WaitForSingleObject(thread2, INFINITE );␍␊ |
␉printf("gvar = %i\n", gvar);␍␊ |
} |