diff --git a/Assignment3/.idea/.gitignore b/Assignment3/.idea/.gitignore
new file mode 100644
index 0000000..1c2fda5
--- /dev/null
+++ b/Assignment3/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/Assignment3/.idea/Assignment3.iml b/Assignment3/.idea/Assignment3.iml
new file mode 100644
index 0000000..6d70257
--- /dev/null
+++ b/Assignment3/.idea/Assignment3.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/Assignment3/.idea/misc.xml b/Assignment3/.idea/misc.xml
new file mode 100644
index 0000000..f1c67df
--- /dev/null
+++ b/Assignment3/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Assignment3/.idea/modules.xml b/Assignment3/.idea/modules.xml
new file mode 100644
index 0000000..87fee1b
--- /dev/null
+++ b/Assignment3/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assignment3/.idea/vcs.xml b/Assignment3/.idea/vcs.xml
new file mode 100644
index 0000000..2e3f692
--- /dev/null
+++ b/Assignment3/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Assignment3/CMakeLists.txt b/Assignment3/CMakeLists.txt
new file mode 100644
index 0000000..e769cd2
--- /dev/null
+++ b/Assignment3/CMakeLists.txt
@@ -0,0 +1,6 @@
+cmake_minimum_required(VERSION 3.20)
+project(Assignment3 C)
+
+set(CMAKE_C_STANDARD 99)
+
+add_executable(Assignment3 main.c)
diff --git a/Assignment3/documentation/Assignment 3.pdf b/Assignment3/documentation/Assignment 3.pdf
new file mode 100644
index 0000000..a22c7c8
Binary files /dev/null and b/Assignment3/documentation/Assignment 3.pdf differ
diff --git a/Assignment3/documentation/sample_code.txt b/Assignment3/documentation/sample_code.txt
new file mode 100644
index 0000000..994c5cd
--- /dev/null
+++ b/Assignment3/documentation/sample_code.txt
@@ -0,0 +1,35 @@
+#include // for pthread_create(), pthread_join(), etc.
+#include // for scanf(), printf(), etc.
+#include // for malloc()
+#include // for sleep()
+
+#define NUMBER_OF_BOXES_PER_DWELLER 5
+#define ROOM_IN_TRUCK 10
+#define MIN_BOX_WEIGHT 5
+#define MAX_BOX_WEIGHT 50
+#define MAX_TIME_FOR_HOUSE_DWELLER 7
+#define MIN_TIME_FOR_HOUSE_DWELLER 1
+#define MAX_TIME_FOR_MOVER 3
+#define MIN_TIME_FOR_MOVER 1
+#define MIN_TIME_FOR_TRUCKER 1
+#define MAX_TIME_FOR_TRUCKER 3
+#define MIN_TRIP_TIME 5
+#define MAX_TRIP_TIME 10
+#define RANDOM_WITHIN_RANGE(a,b,seed) (a+rand_r(&seed)%(b-a))
+// For pipes
+#define READ_END 0
+#define WRITE_END 1
+
+// Pipe between house dwellers and movers
+int houseFloor[2];
+// Pipe between movers and truckers
+int nextToTrucks[2];
+
+// some function definitions follow
+
+int main(int argc, char** argv){
+ srand(time(NULL));
+
+// rest of the program follows
+ return 0;
+}
\ No newline at end of file
diff --git a/Assignment3/documentation/sample_execution.txt b/Assignment3/documentation/sample_execution.txt
new file mode 100644
index 0000000..9120924
--- /dev/null
+++ b/Assignment3/documentation/sample_execution.txt
@@ -0,0 +1,62 @@
+Please input number of people living in the house, number of movers and number of truck drivers
+3 2 1
+Hello from house dweller 0
+Hello from house dweller 1
+Hello from house dweller 2
+Hello from mover 1
+Hello from mover 0
+Hello from truck driver 0
+House dweller 1 created a box that weighs 17 in 5 units of time
+House dweller 0 created a box that weighs 19 in 6 units of time
+House dweller 2 created a box that weighs 13 in 6 units of time
+House dweller 1 created a box that weighs 30 in 1 units of time
+Mover 0 brought down a box that weighs 17 in 1 units of time
+Mover 0 brought down a box that weighs 13 in 1 units of time
+Mover 1 brought down a box that weighs 19 in 2 units of time
+Trucker 0 loaded up a box that weighs 17 to the truck, took 2 units of time, room left:9
+Mover 0 brought down a box that weighs 30 in 1 units of time
+Trucker 0 loaded up a box that weighs 13 to the truck, took 1 units of time, room left:8
+House dweller 1 created a box that weighs 6 in 4 units of time
+House dweller 0 created a box that weighs 20 in 4 units of time
+Trucker 0 loaded up a box that weighs 19 to the truck, took 2 units of time, room left:7
+House dweller 2 created a box that weighs 44 in 6 units of time
+Mover 0 brought down a box that weighs 20 in 2 units of time
+House dweller 0 created a box that weighs 17 in 2 units of time
+Mover 1 brought down a box that weighs 6 in 2 units of time
+House dweller 1 created a box that weighs 26 in 2 units of time
+Mover 0 brought down a box that weighs 44 in 1 units of time
+Trucker 0 loaded up a box that weighs 30 to the truck, took 2 units of time, room left:6
+Mover 1 brought down a box that weighs 26 in 2 units of time
+Trucker 0 loaded up a box that weighs 20 to the truck, took 1 units of time, room left:5
+Mover 0 brought down a box that weighs 17 in 2 units of time
+Trucker 0 loaded up a box that weighs 6 to the truck, took 1 units of time, room left:4
+House dweller 0 created a box that weighs 25 in 4 units of time
+Trucker 0 loaded up a box that weighs 44 to the truck, took 1 units of time, room left:3
+House dweller 1 created a box that weighs 40 in 5 units of time
+House dweller 1 is done packing
+Trucker 0 loaded up a box that weighs 26 to the truck, took 1 units of time, room left:2
+House dweller 2 created a box that weighs 49 in 6 units of time
+Mover 0 brought down a box that weighs 25 in 2 units of time
+Mover 1 brought down a box that weighs 40 in 2 units of time
+Trucker 0 loaded up a box that weighs 17 to the truck, took 2 units of time, room left:1
+Mover 0 brought down a box that weighs 49 in 2 units of time
+Trucker 0 loaded up a box that weighs 25 to the truck, took 1 units of time, room left:0
+Full truck 0 with load of 217 units of mass departed, round-trip will take 6
+House dweller 0 created a box that weighs 14 in 6 units of time
+House dweller 0 is done packing
+House dweller 2 created a box that weighs 35 in 6 units of time
+Mover 0 brought down a box that weighs 14 in 2 units of time
+Mover 1 brought down a box that weighs 35 in 1 units of time
+Trucker 0 loaded up a box that weighs 40 to the truck, took 2 units of time, room left:9
+Trucker 0 loaded up a box that weighs 49 to the truck, took 1 units of time, room left:8
+House dweller 2 created a box that weighs 11 in 6 units of time
+House dweller 2 is done packing
+Mover 0 is done moving boxes downstairs
+Trucker 0 loaded up a box that weighs 14 to the truck, took 2 units of time, room left:7
+Mover 1 brought down a box that weighs 11 in 2 units of time
+Mover 1 is done moving boxes downstairs
+Trucker 0 loaded up a box that weighs 35 to the truck, took 2 units of time, room left:6
+Trucker 0 loaded up a box that weighs 11 to the truck, took 2 units of time, room left:5
+Not full truck with load of 149 units of mass departed, one way trip will take 5
+Trucker 0 is finished
+Moving is finished!
\ No newline at end of file
diff --git a/Assignment3/documentation/sample_execution_2.txt b/Assignment3/documentation/sample_execution_2.txt
new file mode 100644
index 0000000..e2ad786
--- /dev/null
+++ b/Assignment3/documentation/sample_execution_2.txt
@@ -0,0 +1,100 @@
+Please input number of people living in the house, number of movers and number of truck drivers
+5 2 2
+Hello from house dweller 0
+Hello from house dweller 1
+Hello from house dweller 2
+Hello from house dweller 3
+Hello from mover 1
+Hello from house dweller 4
+Hello from truck driver 0
+Hello from mover 0
+Hello from truck driver 1
+House dweller 0 created a box that weighs 11 in 1 units of time
+House dweller 4 created a box that weighs 37 in 1 units of time
+Mover 1 brought down a box that weighs 37 in 1 units of time
+Mover 0 brought down a box that weighs 11 in 1 units of time
+House dweller 3 created a box that weighs 40 in 3 units of time
+Trucker 0 loaded up a box that weighs 37 to the truck, took 1 units of time, room left:9
+House dweller 2 created a box that weighs 49 in 4 units of time
+House dweller 4 created a box that weighs 22 in 3 units of time
+House dweller 3 created a box that weighs 24 in 1 units of time
+Trucker 1 loaded up a box that weighs 11 to the truck, took 2 units of time, room left:9
+House dweller 0 created a box that weighs 24 in 4 units of time
+Mover 0 brought down a box that weighs 40 in 2 units of time
+House dweller 1 created a box that weighs 38 in 6 units of time
+Mover 1 brought down a box that weighs 49 in 2 units of time
+House dweller 4 created a box that weighs 44 in 2 units of time
+Trucker 1 loaded up a box that weighs 40 to the truck, took 2 units of time, room left:8
+House dweller 3 created a box that weighs 33 in 3 units of time
+Mover 0 brought down a box that weighs 22 in 2 units of time
+Trucker 0 loaded up a box that weighs 49 to the truck, took 2 units of time, room left:8
+Mover 1 brought down a box that weighs 24 in 2 units of time
+House dweller 2 created a box that weighs 6 in 4 units of time
+House dweller 4 created a box that weighs 19 in 2 units of time
+Mover 0 brought down a box that weighs 24 in 1 units of time
+Trucker 0 loaded up a box that weighs 24 to the truck, took 1 units of time, room left:7
+House dweller 0 created a box that weighs 19 in 4 units of time
+Trucker 1 loaded up a box that weighs 22 to the truck, took 2 units of time, room left:7
+Mover 0 brought down a box that weighs 44 in 1 units of time
+House dweller 4 created a box that weighs 38 in 2 units of time
+House dweller 4 is done packing
+Mover 1 brought down a box that weighs 38 in 2 units of time
+Trucker 0 loaded up a box that weighs 24 to the truck, took 1 units of time, room left:6
+Mover 0 brought down a box that weighs 33 in 1 units of time
+Mover 1 brought down a box that weighs 6 in 1 units of time
+Trucker 1 loaded up a box that weighs 44 to the truck, took 2 units of time, room left:6
+House dweller 1 created a box that weighs 26 in 6 units of time
+House dweller 2 created a box that weighs 29 in 4 units of time
+House dweller 3 created a box that weighs 8 in 5 units of time
+Trucker 0 loaded up a box that weighs 38 to the truck, took 2 units of time, room left:5
+Trucker 1 loaded up a box that weighs 33 to the truck, took 1 units of time, room left:5
+Mover 0 brought down a box that weighs 19 in 2 units of time
+Trucker 0 loaded up a box that weighs 6 to the truck, took 1 units of time, room left:4
+House dweller 3 created a box that weighs 39 in 1 units of time
+House dweller 3 is done packing
+Mover 1 brought down a box that weighs 19 in 2 units of time
+House dweller 0 created a box that weighs 44 in 5 units of time
+Mover 1 brought down a box that weighs 26 in 1 units of time
+Trucker 1 loaded up a box that weighs 19 to the truck, took 2 units of time, room left:4
+Mover 0 brought down a box that weighs 38 in 2 units of time
+Trucker 0 loaded up a box that weighs 19 to the truck, took 2 units of time, room left:3
+Mover 1 brought down a box that weighs 29 in 1 units of time
+Mover 0 brought down a box that weighs 8 in 1 units of time
+House dweller 2 created a box that weighs 33 in 4 units of time
+Trucker 1 loaded up a box that weighs 26 to the truck, took 2 units of time, room left:3
+Mover 1 brought down a box that weighs 39 in 1 units of time
+Trucker 0 loaded up a box that weighs 38 to the truck, took 2 units of time, room left:2
+Mover 0 brought down a box that weighs 44 in 2 units of time
+House dweller 1 created a box that weighs 17 in 6 units of time
+Trucker 1 loaded up a box that weighs 29 to the truck, took 2 units of time, room left:2
+Mover 1 brought down a box that weighs 33 in 2 units of time
+Trucker 0 loaded up a box that weighs 8 to the truck, took 1 units of time, room left:1
+House dweller 2 created a box that weighs 13 in 3 units of time
+House dweller 2 is done packing
+Trucker 1 loaded up a box that weighs 39 to the truck, took 1 units of time, room left:1
+Trucker 0 loaded up a box that weighs 44 to the truck, took 1 units of time, room left:0
+Full truck 0 with load of 287 units of mass departed, round-trip will take 8
+Mover 0 brought down a box that weighs 17 in 2 units of time
+House dweller 0 created a box that weighs 42 in 6 units of time
+House dweller 0 is done packing
+Mover 1 brought down a box that weighs 13 in 1 units of time
+Trucker 1 loaded up a box that weighs 33 to the truck, took 1 units of time, room left:0
+Full truck 1 with load of 296 units of mass departed, round-trip will take 8
+House dweller 1 created a box that weighs 39 in 4 units of time
+Mover 0 brought down a box that weighs 42 in 2 units of time
+Mover 1 brought down a box that weighs 39 in 2 units of time
+House dweller 1 created a box that weighs 5 in 5 units of time
+House dweller 1 is done packing
+Mover 0 is done moving boxes downstairs
+Mover 1 brought down a box that weighs 5 in 2 units of time
+Mover 1 is done moving boxes downstairs
+Trucker 0 loaded up a box that weighs 17 to the truck, took 2 units of time, room left:9
+Trucker 1 loaded up a box that weighs 13 to the truck, took 2 units of time, room left:9
+Trucker 0 loaded up a box that weighs 42 to the truck, took 1 units of time, room left:8
+Trucker 1 loaded up a box that weighs 39 to the truck, took 1 units of time, room left:8
+Not full truck with load of 52 units of mass departed, one way trip will take 9
+Trucker 0 loaded up a box that weighs 5 to the truck, took 1 units of time, room left:7
+Not full truck with load of 64 units of mass departed, one way trip will take 8
+Trucker 0 is finished
+Trucker 1 is finished
+Moving is finished!
\ No newline at end of file
diff --git a/Assignment3/examples/1-no_join-fixed.c b/Assignment3/examples/1-no_join-fixed.c
new file mode 100644
index 0000000..d0e3efa
--- /dev/null
+++ b/Assignment3/examples/1-no_join-fixed.c
@@ -0,0 +1,17 @@
+/**To compile, don't forget to add -lpthread. Might not work without that */
+#include
+#include
+
+void* run (void* arg){
+ printf("Hello from run\n");
+ return NULL;
+}
+
+int main(){
+ pthread_t thread; // variable to store the reference to the thread
+ pthread_create(&thread, NULL, &run, NULL);
+ printf("In main"); // This section will be executed in parallel
+ pthread_join(thread,NULL); // necessary for waiting for the thread to finish
+ printf("In main 2");
+ return 0;
+}
\ No newline at end of file
diff --git a/Assignment3/examples/2-sleep no_join-fixed.c b/Assignment3/examples/2-sleep no_join-fixed.c
new file mode 100644
index 0000000..4faecd4
--- /dev/null
+++ b/Assignment3/examples/2-sleep no_join-fixed.c
@@ -0,0 +1,23 @@
+#include
+#include
+#include
+#include
+#include
+#include
+
+void* run (void* arg){
+ printf("Hello from run\n");
+ return NULL;
+}
+
+int main(){
+ pthread_t thread;
+ pthread_create(&thread, NULL, &run, NULL);
+ // While the sleep() function will appear to provide synchronization,
+ // it is incorrect, and if used for this purposes instead of join
+ // or synchronization mechanism - the grade for the assignment will be
+ // reduced
+ sleep(2);
+ printf("Back in main");
+ return 0;
+}
diff --git a/Assignment3/examples/3-losing_track_of_threads-fixed.c b/Assignment3/examples/3-losing_track_of_threads-fixed.c
new file mode 100644
index 0000000..4703f9d
--- /dev/null
+++ b/Assignment3/examples/3-losing_track_of_threads-fixed.c
@@ -0,0 +1,24 @@
+#include
+#include
+#include
+#include
+#include
+#include
+
+void* run (void* arg){
+ sleep(10-(int)arg);
+ printf("Hello from run\n");
+}
+
+int main(){
+ pthread_t thread[10];
+ int i = 0;
+ for (i = 0 ; i < 10; ++i)
+ pthread_create(&thread[i], NULL, &run,(void*)i);
+
+ // If you plan to use the results of all the threads, consider
+ // using join for all of the threads
+ for (i = 0 ; i < 10; ++i)
+ pthread_join(thread[i],NULL);
+ printf("In main");
+}
\ No newline at end of file
diff --git a/Assignment3/examples/4-passing_data_wrongly.c b/Assignment3/examples/4-passing_data_wrongly.c
new file mode 100644
index 0000000..8f7cfc1
--- /dev/null
+++ b/Assignment3/examples/4-passing_data_wrongly.c
@@ -0,0 +1,21 @@
+#include
+#include
+
+void* run (void* arg){
+ int i = (int) arg;
+ printf("Hello from run, arg is %i\n",i);
+}
+
+int main(){
+ pthread_t thread[10];
+ int i = 0;
+ for (i = 0 ; i < 10; ++i)
+ pthread_create(&thread, NULL, &run,(void*)i);
+ // Notice how warnings are generated. This can be resolved by properly
+ // allocating space for the thread parameters.
+ // Note, that if you are using stack variable, the values might be corrupted
+ for (i = 0 ; i < 10; i++){
+ pthread_join(thread[i],NULL);
+ }
+ printf("In main");
+}
\ No newline at end of file
diff --git a/Assignment3/examples/4-passing_data_wrongly_fixed.c b/Assignment3/examples/4-passing_data_wrongly_fixed.c
new file mode 100644
index 0000000..1e6b470
--- /dev/null
+++ b/Assignment3/examples/4-passing_data_wrongly_fixed.c
@@ -0,0 +1,31 @@
+#include
+#include
+#include
+
+typedef struct thread_args{
+ char letter;
+ int id;
+}Args;
+void* run (void* arg){
+ Args* argg = (Args*) arg;
+ int i = argg->id;
+ printf("Hello from run %d\n", i);
+ return NULL;
+}
+
+int main(int argc, char** argv){
+ pthread_t thread[10];
+ int i = 0;
+ for (i = 0 ; i < 10; i++){
+ Args* argg = (Args*) (malloc(sizeof(Args)));
+ argg->letter = 'q';
+ argg->id = i;
+ pthread_create(&(thread[i]), NULL, &run,(void*)argg);
+ }
+ for (i = 0 ; i < 10; i++){
+ pthread_join(thread[i],NULL);
+ }
+ // Free the resources somewhere, for long running program. Or let the OS handle that
+ printf("In main");
+ return 0;
+}
\ No newline at end of file
diff --git a/Assignment3/examples/5-pthread_detach.c b/Assignment3/examples/5-pthread_detach.c
new file mode 100644
index 0000000..1af07af
--- /dev/null
+++ b/Assignment3/examples/5-pthread_detach.c
@@ -0,0 +1,19 @@
+#include
+#include
+
+void* run (void* arg){
+ printf("Hello from run\n");
+ return NULL;
+}
+
+int main(){
+ pthread_t thread;
+ pthread_create(&thread, NULL, &run, NULL);
+ pthread_detach(thread);
+ // This command will make thread detached. This means the resources will be released
+ // upon the thread's completion - calling return
+ // However, detached threads cannot be joined, which means if you care about the result
+ // of the thread execution - you should not be using pthread_detach
+ printf("In main");
+ return 0;
+}
\ No newline at end of file
diff --git a/Assignment3/main.c b/Assignment3/main.c
new file mode 100644
index 0000000..1d43251
--- /dev/null
+++ b/Assignment3/main.c
@@ -0,0 +1,151 @@
+#include // for pthread_create(), pthread_join(), etc.
+#include // for scanf(), printf(), etc.
+#include // for malloc()
+#include // for sleep()
+
+#define NUMBER_OF_BOXES_PER_DWELLER 5
+#define ROOM_IN_TRUCK 10
+#define MIN_BOX_WEIGHT 5
+#define MAX_BOX_WEIGHT 50
+#define MAX_TIME_FOR_HOUSE_DWELLER 7
+#define MIN_TIME_FOR_HOUSE_DWELLER 1
+#define MAX_TIME_FOR_MOVER 3
+#define MIN_TIME_FOR_MOVER 1
+#define MIN_TIME_FOR_TRUCKER 1
+#define MAX_TIME_FOR_TRUCKER 3
+#define MIN_TRIP_TIME 5
+#define MAX_TRIP_TIME 10
+#define RANDOM_WITHIN_RANGE(a,b,seed) (a+rand_r(&seed)%(b-a))
+// For pipes
+#define READ_END 0
+#define WRITE_END 1
+
+// Pipe between house dwellers and movers
+int houseFloor[2];
+// Pipe between movers and truckers
+int nextToTrucks[2];
+
+typedef struct args {
+ int id;
+ unsigned int seed;
+} Args;
+
+void* dweller(void* arg) {
+ Args *args = (Args*) arg;
+ int id = args->id;
+ unsigned int seed = args->seed;
+ printf("Hello from house dweller %d\n", id);
+
+ for(int i = 0; i < NUMBER_OF_BOXES_PER_DWELLER; i++) {
+ int weight = RANDOM_WITHIN_RANGE(MIN_BOX_WEIGHT, MAX_BOX_WEIGHT, seed);
+ int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_HOUSE_DWELLER, MAX_TIME_FOR_HOUSE_DWELLER, seed);
+ sleep(time);
+ write(houseFloor[WRITE_END], &weight, sizeof(int));
+ printf("House dweller %d produced a box that weights %d in %d units of time\n", id, weight, time);
+ }
+ printf("House dweller %d is done packing\n", id);
+ free(args);
+ return NULL;
+}
+
+void* mover(void* arg) {
+ Args *args = (Args*) arg;
+ int id = args->id;
+ unsigned int seed = args->seed;
+ int weight;
+
+ printf("Hello from mover %d\n", id);
+ while (read(houseFloor[READ_END], &weight, sizeof(int)) > 0) {
+ int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_MOVER, MAX_TIME_FOR_MOVER, seed);
+ sleep(time);
+ printf("Mover %d brought down a box of weight %d in %d units of time\n", id, weight, time);
+ write(nextToTrucks[WRITE_END], &weight, sizeof(int));
+ }
+ printf("Mover %d is done moving\n", id);
+ free(args);
+ return NULL;
+}
+
+void* trucker(void* arg) {
+ Args *args = (Args*) arg;
+ int id = args->id;
+ unsigned int seed = args->seed;
+ int capacity = ROOM_IN_TRUCK;
+ int truckWeight = 0;
+ int weight;
+
+ printf("Hello from trucker %d\n", id);
+ while (read(nextToTrucks[READ_END], &weight, sizeof(int)) > 0) {
+ capacity--;
+ truckWeight += weight;
+ int time = RANDOM_WITHIN_RANGE(MIN_TIME_FOR_TRUCKER, MAX_TIME_FOR_TRUCKER, seed);
+ sleep(time);
+ printf("Trucker %d loaded up box of weight %d in %d units of time, room left: %d\n", id, weight, time, capacity);
+
+ if (capacity == 0) {
+ time = RANDOM_WITHIN_RANGE(MIN_TRIP_TIME, MAX_TRIP_TIME, seed);
+ printf("Full truck %d with load of %d units of mass departed. Round trip will take %d units of time\n", id, truckWeight, time);
+ sleep(time);
+ capacity = ROOM_IN_TRUCK;
+ truckWeight = 0;
+ }
+ }
+ printf("Truck %d is not full\n", id);
+ int time = RANDOM_WITHIN_RANGE(MIN_TRIP_TIME/2, MAX_TRIP_TIME/2, seed); // One way trip, so half the time
+ sleep(time);
+ printf("Not full truck %d with load of %d units of mass departed. One way will take %d units of time\n", id, truckWeight, time);
+ printf("Truck %d is finished\n", id);
+ free(args);
+ return NULL;
+}
+
+
+int main(int argc, char **argv) {
+ srand(time(NULL));
+
+ pipe(houseFloor);
+ pipe(nextToTrucks);
+
+ int numberOfHouseDwellers, numberOfMovers, numberOfTruckers;
+ printf("Please input number of people living in the house, number of movers and number of truck drivers\n");
+ scanf("%d %d %d", &numberOfHouseDwellers, &numberOfMovers, &numberOfTruckers);
+
+ pthread_t dwellerThreads[numberOfHouseDwellers];
+ pthread_t moverThreads[numberOfMovers];
+ pthread_t truckerThreads[numberOfTruckers];
+
+ for(int i = 0; i < numberOfHouseDwellers; i++) {
+ Args *args = (Args*) malloc(sizeof(Args));
+ args->id = i;
+ args->seed = rand();
+ pthread_create(&dwellerThreads[i], NULL, &dweller, (void*) args);
+ }
+ for(int i = 0; i < numberOfMovers; i++) {
+ Args *args = (Args*) malloc(sizeof(Args));
+ args->id = i;
+ args->seed = rand();
+ pthread_create(&moverThreads[i], NULL, &mover, (void*) args);
+ }
+ for(int i = 0; i < numberOfTruckers; i++) {
+ Args *args = (Args*) malloc(sizeof(Args));
+ args->id = i;
+ args->seed = rand();
+ pthread_create(&truckerThreads[i], NULL, &trucker, (void*) args);
+ }
+ for (int i = 0; i < numberOfHouseDwellers; i++) {
+ pthread_join(dwellerThreads[i], NULL);
+ }
+ close(houseFloor[WRITE_END]);
+ for (int i = 0; i < numberOfMovers; i++) {
+ pthread_join(moverThreads[i], NULL);
+ }
+ close(houseFloor[READ_END]);
+ close(nextToTrucks[WRITE_END]);
+ for (int i = 0; i < numberOfTruckers; i++) {
+ pthread_join(truckerThreads[i], NULL);
+ }
+ close(nextToTrucks[READ_END]);
+
+ printf("Moving is finished!\n");
+ return 0;
+}
\ No newline at end of file
diff --git a/Assignment3/outputs/3 2 1.txt b/Assignment3/outputs/3 2 1.txt
new file mode 100644
index 0000000..6b6d561
--- /dev/null
+++ b/Assignment3/outputs/3 2 1.txt
@@ -0,0 +1,63 @@
+Please input number of people living in the house, number of movers and number of truck drivers
+3 2 1
+Hello from house dweller 0
+Hello from house dweller 1
+Hello from house dweller 2
+Hello from mover 0
+Hello from mover 1
+Hello from trucker 0
+House dweller 0 produced a box that weights 22 in 1 units of time
+House dweller 2 produced a box that weights 24 in 2 units of time
+House dweller 0 produced a box that weights 42 in 1 units of time
+Mover 0 picked up a box of weight 22 in 2 units of time
+Mover 1 picked up a box of weight 24 in 1 units of time
+House dweller 1 produced a box that weights 42 in 4 units of time
+House dweller 2 produced a box that weights 47 in 2 units of time
+Mover 0 picked up a box of weight 42 in 1 units of time
+Trucker 0 loaded a box of weight 22 in 2 units of time, room left: 9
+Mover 0 picked up a box of weight 47 in 1 units of time
+Mover 1 picked up a box of weight 42 in 2 units of time
+House dweller 0 produced a box that weights 26 in 5 units of time
+Trucker 0 loaded a box of weight 24 in 2 units of time, room left: 8
+Mover 0 picked up a box of weight 26 in 1 units of time
+Trucker 0 loaded a box of weight 42 in 1 units of time, room left: 7
+House dweller 2 produced a box that weights 19 in 5 units of time
+House dweller 0 produced a box that weights 45 in 2 units of time
+House dweller 1 produced a box that weights 40 in 6 units of time
+Mover 1 picked up a box of weight 19 in 1 units of time
+Trucker 0 loaded a box of weight 47 in 2 units of time, room left: 6
+Mover 0 picked up a box of weight 45 in 2 units of time
+Mover 1 picked up a box of weight 40 in 1 units of time
+Trucker 0 loaded a box of weight 42 in 1 units of time, room left: 5
+House dweller 0 produced a box that weights 37 in 3 units of time
+House dweller 0 is done packing
+Mover 0 picked up a box of weight 37 in 1 units of time
+Trucker 0 loaded a box of weight 26 in 2 units of time, room left: 4
+House dweller 1 produced a box that weights 31 in 4 units of time
+Trucker 0 loaded a box of weight 19 in 1 units of time, room left: 3
+Mover 1 picked up a box of weight 31 in 1 units of time
+House dweller 1 produced a box that weights 17 in 1 units of time
+House dweller 2 produced a box that weights 27 in 6 units of time
+Trucker 0 loaded a box of weight 40 in 2 units of time, room left: 2
+Mover 0 picked up a box of weight 27 in 2 units of time
+Mover 1 picked up a box of weight 17 in 2 units of time
+Trucker 0 loaded a box of weight 45 in 2 units of time, room left: 1
+House dweller 2 produced a box that weights 33 in 4 units of time
+House dweller 2 is done packing
+Trucker 0 loaded a box of weight 37 in 1 units of time, room left: 0
+Full truck 0 with load of 344 units of mass departed. Round trip will take 7 units of time
+House dweller 1 produced a box that weights 14 in 5 units of time
+House dweller 1 is done packing
+Mover 0 picked up a box of weight 33 in 1 units of time
+Mover 0 is done moving
+Mover 1 picked up a box of weight 14 in 1 units of time
+Mover 1 is done moving
+Trucker 0 loaded a box of weight 31 in 2 units of time, room left: 9
+Trucker 0 loaded a box of weight 27 in 2 units of time, room left: 8
+Trucker 0 loaded a box of weight 17 in 2 units of time, room left: 7
+Trucker 0 loaded a box of weight 33 in 2 units of time, room left: 6
+Trucker 0 loaded a box of weight 14 in 2 units of time, room left: 5
+Truck 0 is not full
+Not full truck 0 with load of 122 units of mass departed. One way will take 3 units of time
+Truck 0 is finished
+Moving is finished!