This commit is contained in:
p-w-rs
2022-09-30 13:50:51 -05:00
parent 218bf07427
commit b927d70ba7
60 changed files with 793 additions and 433 deletions

BIN
Examples/concurrency/con1 Executable file

Binary file not shown.

View File

@@ -4,11 +4,11 @@
* Also does not work if a process does not want to access the critical section * Also does not work if a process does not want to access the critical section
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -28,9 +28,10 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 1000; j++) for (int j = 0; j < 100000; j++)
{ {
while (turn != me) while (turn != me)
{ {
@@ -55,11 +56,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.con1</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/con2 Executable file

Binary file not shown.

View File

@@ -4,11 +4,11 @@
* Due to race conditions with the flag array, it cannot guarentee mutual exclusion * Due to race conditions with the flag array, it cannot guarentee mutual exclusion
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -28,7 +28,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 100000000; j++) for (int j = 0; j < 100000000; j++)
{ {
@@ -49,7 +50,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
int main() int main()
{ {
int val1 = 0; int val1 = 0;
@@ -57,11 +57,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.con2</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/con3 Executable file

Binary file not shown.

View File

@@ -6,11 +6,11 @@
* if both threads set the flag at the same time * if both threads set the flag at the same time
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -30,7 +30,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 100000000; j++) for (int j = 0; j < 100000000; j++)
{ {
@@ -58,11 +59,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.con3</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/con4 Executable file

Binary file not shown.

View File

@@ -7,11 +7,11 @@
* Prone to livelock since threads might be constantly releasing their flag * Prone to livelock since threads might be constantly releasing their flag
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -32,7 +32,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
@@ -56,7 +57,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
int main() int main()
{ {
int val1 = 0; int val1 = 0;
@@ -64,11 +64,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.con4</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/con_dekkers Executable file

Binary file not shown.

View File

@@ -7,11 +7,11 @@
* Also does not work on modern CPUs that perform out-of-order execution * Also does not work on modern CPUs that perform out-of-order execution
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -35,7 +35,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
@@ -47,7 +48,8 @@ void* thread_routine(void* args)
// just in case there is deadlock // just in case there is deadlock
flag[me] = 0; flag[me] = 0;
} }
while (turn == you); while (turn == you)
;
flag[me] = 1; flag[me] = 1;
} }
// this is the critical section // this is the critical section
@@ -63,7 +65,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
int main() int main()
{ {
int val1 = 0; int val1 = 0;
@@ -71,11 +72,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.con_dekkers</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/mutex1 Executable file

Binary file not shown.

View File

@@ -3,11 +3,11 @@
* that increments two global variables * that increments two global variables
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -29,7 +29,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
@@ -46,7 +47,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
// Main process // Main process
int main() int main()
{ {
@@ -55,11 +55,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.mutex1</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/mutex2 Executable file

Binary file not shown.

View File

@@ -4,11 +4,11 @@
* unlocked * unlocked
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -30,7 +30,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
@@ -41,7 +42,8 @@ void* thread_routine(void* args)
// leaving critical section // leaving critical section
pthread_mutex_unlock(&flag); pthread_mutex_unlock(&flag);
if(me == 0) { if (me == 0)
{
pthread_mutex_unlock(&flag); pthread_mutex_unlock(&flag);
} }
} }
@@ -51,7 +53,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
// Main process // Main process
int main() int main()
{ {
@@ -60,11 +61,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.mutex2</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/mutex3 Executable file

Binary file not shown.

View File

@@ -4,11 +4,11 @@
* locked * locked
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -30,12 +30,14 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
pthread_mutex_lock(&flag); pthread_mutex_lock(&flag);
if(me == 0) { if (me == 0)
{
pthread_mutex_lock(&flag); pthread_mutex_lock(&flag);
} }
@@ -51,7 +53,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
// Main process // Main process
int main() int main()
{ {
@@ -60,11 +61,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.mutex3</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/prod_cons1 Executable file

Binary file not shown.

View File

@@ -6,19 +6,20 @@
* a consumer might attempt to read when the space is empty * a consumer might attempt to read when the space is empty
*/ */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h> #include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFFER_SIZE 30 #define BUFFER_SIZE 30
#define ELEMENTS 100 #define ELEMENTS 100
// Shared Buffer // Shared Buffer
typedef struct circular_buffer { typedef struct circular_buffer
{
unsigned char values[BUFFER_SIZE]; unsigned char values[BUFFER_SIZE];
int out_idx; int out_idx;
int in_idx; int in_idx;
@@ -35,7 +36,8 @@ void buffer_init(circular_buffer* b)
void buffer_insert(circular_buffer *b, unsigned char value) void buffer_insert(circular_buffer *b, unsigned char value)
{ {
if(b->values[b->in_idx] != 0) { if (b->values[b->in_idx] != 0)
{
printf("ERROR: Inserting into buffer when an element exists. Empty was expected\n"); printf("ERROR: Inserting into buffer when an element exists. Empty was expected\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -46,7 +48,8 @@ void buffer_insert(circular_buffer* b, unsigned char value)
unsigned char buffer_remove(circular_buffer *b) unsigned char buffer_remove(circular_buffer *b)
{ {
unsigned char return_value = b->values[b->out_idx]; unsigned char return_value = b->values[b->out_idx];
if(return_value == 0) { if (return_value == 0)
{
printf("ERROR: Removing from a buffer at an empty element. Something was expected\n"); printf("ERROR: Removing from a buffer at an empty element. Something was expected\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -62,9 +65,11 @@ volatile int start = 0;
void *producer() void *producer()
{ {
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for(int i = 0; i < ELEMENTS; i++) { for (int i = 0; i < ELEMENTS; i++)
{
// Add an element to the buffer // Add an element to the buffer
unsigned char value = (i % 100) + 1; // Make sure the value isn't zero unsigned char value = (i % 100) + 1; // Make sure the value isn't zero
buffer_insert(&buffer, value); buffer_insert(&buffer, value);
@@ -78,9 +83,11 @@ void* producer()
void *consumer() void *consumer()
{ {
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for(int i = 0; i < ELEMENTS; i++) { for (int i = 0; i < ELEMENTS; i++)
{
// Remove an element from the buffer // Remove an element from the buffer
printf("Consumer removed: %d\n", buffer_remove(&buffer)); printf("Consumer removed: %d\n", buffer_remove(&buffer));
} }
@@ -88,7 +95,6 @@ void* consumer()
return NULL; return NULL;
} }
// Main process // Main process
int main() int main()
{ {
@@ -96,11 +102,13 @@ int main()
pthread_t prod; pthread_t prod;
pthread_t cons; pthread_t cons;
if(pthread_create(&prod, NULL, producer, NULL) == -1) { if (pthread_create(&prod, NULL, producer, NULL) == -1)
{
printf("COULD NOT CREATE PRODUCER\n"); printf("COULD NOT CREATE PRODUCER\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&cons, NULL, consumer, NULL) == -1) { if (pthread_create(&cons, NULL, consumer, NULL) == -1)
{
printf("COULD NOT CREATE CONSUMER\n"); printf("COULD NOT CREATE CONSUMER\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.prod_cons1</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/prod_cons2 Executable file

Binary file not shown.

View File

@@ -7,19 +7,20 @@
* Consusmers wait for at least one filled spot before reading * Consusmers wait for at least one filled spot before reading
*/ */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h> #include <pthread.h>
#include <semaphore.h> #include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFFER_SIZE 30 #define BUFFER_SIZE 30
#define ELEMENTS 100 #define ELEMENTS 100
// Shared Buffer // Shared Buffer
typedef struct circular_buffer { typedef struct circular_buffer
{
unsigned char values[BUFFER_SIZE]; unsigned char values[BUFFER_SIZE];
int out_idx; int out_idx;
int in_idx; int in_idx;
@@ -36,7 +37,8 @@ void buffer_init(circular_buffer* b)
void buffer_insert(circular_buffer *b, unsigned char value) void buffer_insert(circular_buffer *b, unsigned char value)
{ {
if(b->values[b->in_idx] != 0) { if (b->values[b->in_idx] != 0)
{
printf("ERROR: Inserting into buffer when an element exists. Empty was expected\n"); printf("ERROR: Inserting into buffer when an element exists. Empty was expected\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -47,7 +49,8 @@ void buffer_insert(circular_buffer* b, unsigned char value)
unsigned char buffer_remove(circular_buffer *b) unsigned char buffer_remove(circular_buffer *b)
{ {
unsigned char return_value = b->values[b->out_idx]; unsigned char return_value = b->values[b->out_idx];
if(return_value == 0) { if (return_value == 0)
{
printf("ERROR: Removing from a buffer at an empty element. Something was expected\n"); printf("ERROR: Removing from a buffer at an empty element. Something was expected\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -67,9 +70,11 @@ volatile int start = 0;
void *producer() void *producer()
{ {
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for(int i = 0; i < ELEMENTS; i++) { for (int i = 0; i < ELEMENTS; i++)
{
// Wait for a free spot in the buffer // Wait for a free spot in the buffer
sem_wait(&emptyCount); sem_wait(&emptyCount);
@@ -89,9 +94,11 @@ void* producer()
void *consumer() void *consumer()
{ {
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for(int i = 0; i < ELEMENTS; i++) { for (int i = 0; i < ELEMENTS; i++)
{
// Wait for element to consume // Wait for element to consume
sem_wait(&fullCount); sem_wait(&fullCount);
@@ -105,7 +112,6 @@ void* consumer()
return NULL; return NULL;
} }
// Main process // Main process
int main() int main()
{ {
@@ -115,11 +121,13 @@ int main()
pthread_t prod; pthread_t prod;
pthread_t cons; pthread_t cons;
if(pthread_create(&prod, NULL, producer, NULL) == -1) { if (pthread_create(&prod, NULL, producer, NULL) == -1)
{
printf("COULD NOT CREATE PRODUCER\n"); printf("COULD NOT CREATE PRODUCER\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&cons, NULL, consumer, NULL) == -1) { if (pthread_create(&cons, NULL, consumer, NULL) == -1)
{
printf("COULD NOT CREATE CONSUMER\n"); printf("COULD NOT CREATE CONSUMER\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.prod_cons2</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/race Executable file

Binary file not shown.

View File

@@ -1,14 +1,14 @@
/* s /*
* race.c - Shows the race condition that can happen * race.c - Shows the race condition that can happen
* then threads try to modify multiple global * then threads try to modify multiple global
* values at the same time * values at the same time
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
// start flag // start flag
volatile int start = 0; volatile int start = 0;
@@ -25,7 +25,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 100000000; j++) for (int j = 0; j < 100000000; j++)
{ {
@@ -47,11 +48,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -65,4 +68,3 @@ int main()
printf("counter2: %d\n", counter2); printf("counter2: %d\n", counter2);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.race</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/sem1 Executable file

Binary file not shown.

View File

@@ -3,12 +3,12 @@
* critical section * critical section
*/ */
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -30,7 +30,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
@@ -47,7 +48,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
// Main process // Main process
int main() int main()
{ {
@@ -59,11 +59,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.sem1</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/sem2 Executable file

Binary file not shown.

View File

@@ -4,12 +4,12 @@
* the count regardless of the current value * the count regardless of the current value
*/ */
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
// shared global // shared global
static int counter1 = 0; static int counter1 = 0;
@@ -31,7 +31,8 @@ void* thread_routine(void* args)
printf("Worker thread: %d ready, you are %d\n", me, you); printf("Worker thread: %d ready, you are %d\n", me, you);
// wait for start from master thread // wait for start from master thread
while(!start); while (!start)
;
for (int j = 0; j < 100000000; j++) for (int j = 0; j < 100000000; j++)
{ {
@@ -42,7 +43,8 @@ void* thread_routine(void* args)
// leaving critical section // leaving critical section
sem_post(&flag); sem_post(&flag);
if(me == 0) { if (me == 0)
{
sem_post(&flag); sem_post(&flag);
} }
} }
@@ -52,7 +54,6 @@ void* thread_routine(void* args)
return NULL; return NULL;
} }
// Main process // Main process
int main() int main()
{ {
@@ -63,11 +64,13 @@ int main()
pthread_t thr1; pthread_t thr1;
pthread_t thr2; pthread_t thr2;
if(pthread_create(&thr1, NULL, thread_routine, (void*)&val1) == -1) { if (pthread_create(&thr1, NULL, thread_routine, (void *)&val1) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(pthread_create(&thr2, NULL, thread_routine, (void*)&val2) == -1) { if (pthread_create(&thr2, NULL, thread_routine, (void *)&val2) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.sem2</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/sem_list1 Executable file

Binary file not shown.

View File

@@ -3,19 +3,21 @@
* uncontrolled access to a singly linked list * uncontrolled access to a singly linked list
*/ */
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
typedef struct node { typedef struct node
{
int val; int val;
struct node *next; struct node *next;
} node; } node;
typedef struct list { typedef struct list
{
node *head; node *head;
} list; } list;
@@ -31,7 +33,8 @@ void* thread_routine()
printf("Worker thread: %lu ready\n", pthread_self()); printf("Worker thread: %lu ready\n", pthread_self());
// wait for start from master thread // wait for start from master thread
while(start == 0); while (start == 0)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
@@ -55,8 +58,10 @@ int main()
mylist.head = NULL; mylist.head = NULL;
// Create the threads // Create the threads
for(int i = 0; i < THREAD_COUNT; i++) { for (int i = 0; i < THREAD_COUNT; i++)
if(pthread_create(&thr_ids[i], NULL, thread_routine, NULL) == -1) { {
if (pthread_create(&thr_ids[i], NULL, thread_routine, NULL) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -66,21 +71,24 @@ int main()
start = 1; start = 1;
// Wait for all threads to finish // Wait for all threads to finish
for(int i = 0; i < THREAD_COUNT; i++) { for (int i = 0; i < THREAD_COUNT; i++)
{
pthread_join(thr_ids[i], NULL); pthread_join(thr_ids[i], NULL);
} }
// Count the elements in the list // Count the elements in the list
int length = 0; int length = 0;
node *itr = mylist.head; node *itr = mylist.head;
while(itr != NULL) { while (itr != NULL)
{
length++; length++;
itr = itr->next; itr = itr->next;
} }
printf("List contains %d elements\n", length); printf("List contains %d elements\n", length);
// Free the list // Free the list
while(mylist.head != NULL) { while (mylist.head != NULL)
{
node *to_delete = mylist.head; node *to_delete = mylist.head;
mylist.head = mylist.head->next; mylist.head = mylist.head->next;
free(to_delete); free(to_delete);

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.sem_list1</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

BIN
Examples/concurrency/sem_list2 Executable file

Binary file not shown.

View File

@@ -1,21 +1,23 @@
/* s /*
* sem_list2.c - Uses a semaphore as a way to control access * sem_list2.c - Uses a semaphore as a way to control access
* to a critical section for a singly linked list * to a critical section for a singly linked list
*/ */
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
typedef struct node { typedef struct node
{
int val; int val;
struct node *next; struct node *next;
} node; } node;
typedef struct list { typedef struct list
{
node *head; node *head;
} list; } list;
@@ -34,7 +36,8 @@ void* thread_routine()
printf("Worker thread: %lu ready\n", pthread_self()); printf("Worker thread: %lu ready\n", pthread_self());
// wait for start from master thread // wait for start from master thread
while(start == 0); while (start == 0)
;
for (int j = 0; j < 1000000; j++) for (int j = 0; j < 1000000; j++)
{ {
@@ -62,8 +65,10 @@ int main()
mylist.head = NULL; mylist.head = NULL;
// Create the threads // Create the threads
for(int i = 0; i < THREAD_COUNT; i++) { for (int i = 0; i < THREAD_COUNT; i++)
if(pthread_create(&thr_ids[i], NULL, thread_routine, NULL) == -1) { {
if (pthread_create(&thr_ids[i], NULL, thread_routine, NULL) == -1)
{
printf("COULD NOT CREATE A THREAD\n"); printf("COULD NOT CREATE A THREAD\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@@ -73,21 +78,24 @@ int main()
start = 1; start = 1;
// Wait for all threads to finish // Wait for all threads to finish
for(int i = 0; i < THREAD_COUNT; i++) { for (int i = 0; i < THREAD_COUNT; i++)
{
pthread_join(thr_ids[i], NULL); pthread_join(thr_ids[i], NULL);
} }
// Count the elements in the list // Count the elements in the list
int length = 0; int length = 0;
node *itr = mylist.head; node *itr = mylist.head;
while(itr != NULL) { while (itr != NULL)
{
length++; length++;
itr = itr->next; itr = itr->next;
} }
printf("List contains %d elements\n", length); printf("List contains %d elements\n", length);
// Free the list // Free the list
while(mylist.head != NULL) { while (mylist.head != NULL)
{
node *to_delete = mylist.head; node *to_delete = mylist.head;
mylist.head = mylist.head->next; mylist.head = mylist.head->next;
free(to_delete); free(to_delete);

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIdentifier</key>
<string>com.apple.xcode.dsym.sem_list2</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>dSYM</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>