diff --git a/CPP/multithreading/Makefile b/CPP/multithreading/Makefile new file mode 100644 index 0000000..fe7ddc7 --- /dev/null +++ b/CPP/multithreading/Makefile @@ -0,0 +1,29 @@ +cpp_src = $(wildcard *.cpp) +cpp_src += $(wildcard ./utils/*.cpp) +cpp_src += $(wildcard ./driver/*.cpp) + +cpp_obj = $(cpp_src:.cpp=.o) +c_obj = $(c_src:.c=.o) +CC = g++ +CFLAGS = -Wall -pedantic -li2c +LDFLAGS = -lpthread +EXEC = runtest + + +all : $(EXEC) + +$(EXEC): $(cpp_obj) $(c_obj) + $(CC) -o $@ $^ $(LDFLAGS) + +debug : $(EXEC) + +$(EXEC): $(cpp_obj) $(c_obj) + $(CC) -g -o $@ $^ $(LDFLAGS) + +clean: + rm -rf $(c_obj) $(cpp_obj) $(EXEC) + clear + +cleanall: + rm -rf $(c_obj) $(cpp_obj) $(EXEC) + clear diff --git a/CPP/multithreading/main.cpp b/CPP/multithreading/main.cpp new file mode 100644 index 0000000..4fb1da5 --- /dev/null +++ b/CPP/multithreading/main.cpp @@ -0,0 +1,77 @@ +#include + +#include +#include +#include +#include +#include + +pthread_mutex_t print_mtx; + +class IThread +{ + public: + + private: + + virtual void* _run() = 0; + + static void* _staticRun(void* context) + { + return static_cast(context)->_run(); + } +}; + + + +void printer(std::string a) +{ + pthread_mutex_lock(&print_mtx); + + std::cout << a << std::endl; + + pthread_mutex_unlock(&print_mtx); +} + +void* foo(void* arg) +{ + unsigned int i = 100; + for(;i > 0; i--){ + std::string a = "foo cnt: "; + a += std::to_string(i); + printer(a); + sleep(1); + } + +} + +void* baa(void* arg) +{ + unsigned int i = 5; + + for(;i > 0; i--){ + std::string a = "baa cnt: "; + a += std::to_string(i); + printer(a); + sleep(10); + } +} + +int main() +{ + pthread_t foo_th, baa_th; + + + pthread_mutex_init(&print_mtx, NULL); + + pthread_create(&foo_th, NULL, foo, NULL); + pthread_create(&baa_th, NULL, baa, NULL); + + + pthread_join(foo_th, NULL); + pthread_join(baa_th, NULL); + + + return 0; +} + diff --git a/CPP/multithreading/runtest b/CPP/multithreading/runtest new file mode 100755 index 0000000..4ca9068 Binary files /dev/null and b/CPP/multithreading/runtest differ