diff --git a/temp/resources_lock/Makefile b/temp/resources_lock/Makefile index c516ac5..80e8516 100644 --- a/temp/resources_lock/Makefile +++ b/temp/resources_lock/Makefile @@ -3,7 +3,7 @@ cpp_src = $(wildcard *.cpp) cpp_obj = $(cpp_src:.cpp=.o) c_obj = $(c_src:.c=.o) CC = g++ -CFLAGS = -Wall -pedantic -li2c +CFLAGS = -Wall -pedantic #-li2c -lpthread LDFLAGS = EXEC = runtest @@ -11,7 +11,7 @@ EXEC = runtest all : $(EXEC) $(EXEC): $(cpp_obj) $(c_obj) - $(CC) -o $@ $^ $(LDFLAGS) + $(CC) -pthread -o $@ $^ $(LDFLAGS) clean: rm -rf $(c_obj) $(cpp_obj) $(EXEC) diff --git a/temp/resources_lock/iresource_lock.hpp b/temp/resources_lock/iresource_lock.hpp new file mode 100644 index 0000000..9e52230 --- /dev/null +++ b/temp/resources_lock/iresource_lock.hpp @@ -0,0 +1,26 @@ +#ifndef _RESOURCES_LOCK_HPP_ +#define _RESOURCES_LOCK_HPP_ + +#include <memory> + +/** + * Resource Lock interface class + * + * Used for multithreading purpouses + */ +class ResourceLock +{ + public: + ResourceLock(); + ~ResourceLock(); + + void lock(); + void unlock(); + + private: + class ResourceLock_Impl; + std::unique_ptr<ResourceLock_Impl> impl; + +}; + +#endif // _RESOURCES_LOCK_HPP_ diff --git a/temp/resources_lock/main.cpp b/temp/resources_lock/main.cpp index 54043e7..c0b2505 100644 --- a/temp/resources_lock/main.cpp +++ b/temp/resources_lock/main.cpp @@ -1,9 +1,78 @@ + +#include <stdint.h> +#include <unistd.h> #include <iostream> +#include <functional> +#include <stdlib.h> +#include <stdio.h> +#include <pthread.h> +#include <cstdlib> + + +#include "resources.hpp" + +Resources resources; + + +static void* task_1(void* arg) +{ + int i = 0; + + //for(i = 0; i < 10; i++) { + while(1) { + std::cout << std::endl << "Task 1 wanting to use resources"<< std::endl; + resources.print(1);//std::cout << "Hello, world!" << std::endl; + usleep(1000000); + } + + + while(1) usleep(10000); +}; + +static void* task_2(void* arg) +{ + while(1) + { + std::cout << std::endl << "Task 2 wanting to use resources"<< std::endl; + resources.print(1000); + usleep(10000000); + } +}; + int main(void) { + pthread_t th_task_1; + pthread_t th_task_2; + + + + + int check = 0; + + std::cout << "threads test" << std::endl; + + check = pthread_create(&th_task_1, + NULL, + &task_1, + NULL); + if(check != 0) { + std::cout << "Failed to create thread!" << std::endl; + exit(-1); + } + + + check = pthread_create(&th_task_2, + NULL, + &task_2, + NULL); + if(check != 0) { + std::cout << "Failed to create thread!" << std::endl; + exit(-1); + } - + pthread_join(th_task_1,NULL); + pthread_join(th_task_2,NULL); return 0; diff --git a/temp/resources_lock/rescource_lock.hpp b/temp/resources_lock/rescource_lock.hpp deleted file mode 100644 index e69de29..0000000 diff --git a/temp/resources_lock/resource_lock_psoix.cpp b/temp/resources_lock/resource_lock_psoix.cpp new file mode 100644 index 0000000..5f4b047 --- /dev/null +++ b/temp/resources_lock/resource_lock_psoix.cpp @@ -0,0 +1,60 @@ +#include "iresource_lock.hpp" +#include <pthread.h> +#include <memory> +#include <iostream> + +// +// POSIX implementation +// + +class ResourceLock::ResourceLock_Impl +{ + public: + ResourceLock_Impl() : + mutex(PTHREAD_MUTEX_INITIALIZER) + { + + } + + void lock() + { + pthread_mutex_lock(&mutex); + std::cout << "locked" << std::endl; + } + + void unlock() + { + pthread_mutex_unlock(&mutex); + std::cout << "unlocked" << std::endl; + } + + private: + pthread_mutex_t mutex; +}; + + +// +// information relay +// + +ResourceLock::ResourceLock() : + impl{std::make_unique<ResourceLock_Impl>()} +{ + +} + +ResourceLock::~ResourceLock() +{ + +} + +void ResourceLock::lock() +{ + impl->lock(); +} + +void ResourceLock::unlock() +{ + impl->unlock(); +} + diff --git a/temp/resources_lock/resources.cpp b/temp/resources_lock/resources.cpp new file mode 100644 index 0000000..9c14ae9 --- /dev/null +++ b/temp/resources_lock/resources.cpp @@ -0,0 +1,25 @@ +#include "resources.hpp" + +Resources::Resources() : + pLock(new ResourceLock()) +{ + std::cout << "Ctor resources" << std::endl; +} + +Resources::~Resources() +{ + +} + +void Resources::print(const int& number) +{ + // threadsafe usage of resources + + pLock->lock(); + + std::cout << "resources in use" << std::endl; + std::cout << "printing number: " << number << std::endl; + + pLock->unlock(); +} + diff --git a/temp/resources_lock/resources.hpp b/temp/resources_lock/resources.hpp new file mode 100644 index 0000000..65edaad --- /dev/null +++ b/temp/resources_lock/resources.hpp @@ -0,0 +1,21 @@ +#ifndef _RESOURCES_HPP_ +#define _RESOURCES_HPP_ + +#include <iostream> +#include "iresource_lock.hpp" + +class Resources +{ + public: + Resources(); + ~Resources(); + + //void use(); + void print(const int& number); + private: + ResourceLock* pLock; + + +}; + +#endif // _RESOURCES_HPP_ diff --git a/temp/resources_lock/runtest b/temp/resources_lock/runtest index fa4e0f8..019e3b2 100755 Binary files a/temp/resources_lock/runtest and b/temp/resources_lock/runtest differ