diff --git a/petersons-linux/build2.sh b/petersons-linux/build2.sh new file mode 100644 index 0000000..9748d42 --- /dev/null +++ b/petersons-linux/build2.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +gcc -o main2 -pthread main2.c +./main2 \ No newline at end of file diff --git a/petersons-linux/main2.c b/petersons-linux/main2.c new file mode 100644 index 0000000..be8883c --- /dev/null +++ b/petersons-linux/main2.c @@ -0,0 +1,52 @@ +// This example based off of samples by Jerry Breecher - http://web.cs.wpi.edu/~jb/CS502/Class_Example_Code.html +#include + +#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]; + +void * 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; + +} + +void * 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; + pthread_t thread1, thread2; + int iret1, iret2; + flag[0] = true; + flag[1] = true; + + iret1 = pthread_create( &thread1, NULL, produce, NULL); + iret2 = pthread_create( &thread2, NULL, consume, NULL); + + pthread_join( thread1, NULL); + pthread_join( thread2, NULL); + printf("gvar = %i\n", gvar); +} \ No newline at end of file diff --git a/petersons-windows/build2.bat b/petersons-windows/build2.bat new file mode 100644 index 0000000..4762b3c --- /dev/null +++ b/petersons-windows/build2.bat @@ -0,0 +1 @@ +../vcbuild.bat main2 \ No newline at end of file diff --git a/petersons-windows/main2.c b/petersons-windows/main2.c new file mode 100644 index 0000000..ab94e0d --- /dev/null +++ b/petersons-windows/main2.c @@ -0,0 +1,51 @@ +// This example based off of samples by Jerry Breecher - http://web.cs.wpi.edu/~jb/CS502/Class_Example_Code.html +#include +#include + +#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); +} \ No newline at end of file diff --git a/racecondition-linux/build2.sh b/racecondition-linux/build2.sh new file mode 100644 index 0000000..fe0c25d --- /dev/null +++ b/racecondition-linux/build2.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +gcc -o main -pthread main.c +./main \ No newline at end of file diff --git a/racecondition-linux/main2.c b/racecondition-linux/main2.c new file mode 100644 index 0000000..b241c74 --- /dev/null +++ b/racecondition-linux/main2.c @@ -0,0 +1,30 @@ +#include + +#define LOOP 20000 + +volatile int counter = -1; +volatile long gvar = 0; + +DWORD WINAPI produce(void* data) { + int i = 0; + for (i = 0; i < LOOP; i++) + gvar++; +} + +DWORD WINAPI consume(void* data) { + int i = 0; + for (i = 0; i < LOOP; i++) + gvar--; +} + +int main() { + int i; + pthread_t thread1, thread2; + int iret1, iret2; + iret1 = pthread_create( &thread1, NULL, produce, NULL); + iret2 = pthread_create( &thread2, NULL, consume, NULL); + + pthread_join( thread1, NULL); + pthread_join( thread2, NULL); + printf("gvar = %i\n", gvar); +} \ No newline at end of file diff --git a/racecondition-windows/build2.bat b/racecondition-windows/build2.bat new file mode 100644 index 0000000..4762b3c --- /dev/null +++ b/racecondition-windows/build2.bat @@ -0,0 +1 @@ +../vcbuild.bat main2 \ No newline at end of file diff --git a/racecondition-windows/main2.c b/racecondition-windows/main2.c new file mode 100644 index 0000000..7f64c1b --- /dev/null +++ b/racecondition-windows/main2.c @@ -0,0 +1,30 @@ +// This example based off of samples by Jerry Breecher - http://web.cs.wpi.edu/~jb/CS502/Class_Example_Code.html +#include +#include + +#define LOOP 20000 + +volatile int counter = -1; +volatile long gvar = 0; + +DWORD WINAPI produce(void* data) { + int i = 0; + for (i = 0; i < LOOP; i++) + gvar++; +} + +DWORD WINAPI consume(void* data) { + int i = 0; + for (i = 0; i < LOOP; i++) + gvar--; +} + +int main() { + int i; + HANDLE thread1, thread2; + 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); +} \ No newline at end of file