From d3a7d3bad318361ca7819c43889dfd45e8b12329 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 10 Mar 2016 17:25:47 +0100 Subject: [PATCH] something --- slsDetectorSoftware/Makefile | 4 +- .../multiSlsDetector/multiSlsDetector.cpp | 99 +++++++-- .../multiSlsDetector/multiSlsDetector.h | 11 + slsDetectorSoftware/threadFiles/CondVar.cpp | 17 ++ slsDetectorSoftware/threadFiles/CondVar.h | 24 +++ slsDetectorSoftware/threadFiles/Global.h | 6 + slsDetectorSoftware/threadFiles/Makefile | 21 ++ slsDetectorSoftware/threadFiles/Multi.cpp | 197 ++++++++++++++++++ slsDetectorSoftware/threadFiles/Multi.h | 36 ++++ slsDetectorSoftware/threadFiles/Mutex.cpp | 26 +++ slsDetectorSoftware/threadFiles/Mutex.h | 27 +++ slsDetectorSoftware/threadFiles/Single.cpp | 37 ++++ slsDetectorSoftware/threadFiles/Single.h | 24 +++ slsDetectorSoftware/threadFiles/Task.h | 68 ++++++ .../threadFiles/ThreadPool.cpp | 175 ++++++++++++++++ slsDetectorSoftware/threadFiles/ThreadPool.h | 48 +++++ .../threadFiles/bin/examplethreadpool_test | Bin 0 -> 237980 bytes .../threadFiles/threadpool_test.cpp | 61 ++++++ 18 files changed, 863 insertions(+), 18 deletions(-) create mode 100644 slsDetectorSoftware/threadFiles/CondVar.cpp create mode 100644 slsDetectorSoftware/threadFiles/CondVar.h create mode 100644 slsDetectorSoftware/threadFiles/Global.h create mode 100644 slsDetectorSoftware/threadFiles/Makefile create mode 100644 slsDetectorSoftware/threadFiles/Multi.cpp create mode 100644 slsDetectorSoftware/threadFiles/Multi.h create mode 100644 slsDetectorSoftware/threadFiles/Mutex.cpp create mode 100644 slsDetectorSoftware/threadFiles/Mutex.h create mode 100644 slsDetectorSoftware/threadFiles/Single.cpp create mode 100644 slsDetectorSoftware/threadFiles/Single.h create mode 100644 slsDetectorSoftware/threadFiles/Task.h create mode 100644 slsDetectorSoftware/threadFiles/ThreadPool.cpp create mode 100644 slsDetectorSoftware/threadFiles/ThreadPool.h create mode 100755 slsDetectorSoftware/threadFiles/bin/examplethreadpool_test create mode 100644 slsDetectorSoftware/threadFiles/threadpool_test.cpp diff --git a/slsDetectorSoftware/Makefile b/slsDetectorSoftware/Makefile index 534e097a4..17422ee95 100644 --- a/slsDetectorSoftware/Makefile +++ b/slsDetectorSoftware/Makefile @@ -10,12 +10,12 @@ CFLAGS= -g -DC_ONLY -fPIC DFLAGS= -g -DDACS_INT -INCLUDES?= -IcommonFiles -IslsDetector -I../slsReceiverSoftware/MySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand -IslsDetectorAnalysis -IslsReceiverInterface -I../slsReceiverSoftware/include -I$(ASM) +INCLUDES?= -IcommonFiles -IslsDetector -I../slsReceiverSoftware/MySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand -IslsDetectorAnalysis -IslsReceiverInterface -I../slsReceiverSoftware/include -IthreadFiles -I$(ASM) #EPICSFLAGS=-D EPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/$(EPICS_HOST_ARCH) -Wl,-R/usr/local/epics/base/lib/$(EPICS_HOST_ARCH) -lca -lCom -SRC_CLNT=slsDetectorAnalysis/fileIO.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetectorAnalysis/postProcessingFuncs.cpp slsReceiverInterface/receiverInterface.cpp slsDetector/slsDetectorUsers.cpp #../slsReceiverSoftware/MySocketTCP/MySocketTCP.cpp +SRC_CLNT=slsDetectorAnalysis/fileIO.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetectorAnalysis/postProcessingFuncs.cpp slsReceiverInterface/receiverInterface.cpp slsDetector/slsDetectorUsers.cpp threadFiles/CondVar.cpp threadFiles/Mutex.cpp threadFiles/ThreadPool.cpp #../slsReceiverSoftware/MySocketTCP/MySocketTCP.cpp $(info ) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 5ac484452..9b54ec3c7 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -16,6 +16,8 @@ ID: $Id$ #include "multiSlsDetectorClient.h" #include "postProcessingFuncs.h" #include "usersFunctions.h" +#include "ThreadPool.h" + #include #include #include @@ -265,13 +267,50 @@ multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) getNMods(); getMaxMods(); + if(createThreadPool() == FAIL) + exit(-1); + } multiSlsDetector::~multiSlsDetector() { //removeSlsDetector(); - + destroyThreadPool(); } + +int multiSlsDetector::createThreadPool(){ + if(threadpool){ + threadpool->destroy_threadpool(); + threadpool=0; + } + if(thisMultiDetector->numberOfDetectors < 1){ + cout << "No detectors attached to create threadpool" << endl; + return OK; + } + threadpool = new ThreadPool(thisMultiDetector->numberOfDetectors); + switch(threadpool->initialize_threadpool()){ + case 0: + cerr << "Failed to initialize thread pool!" << endl; + return FAIL; + case 1: + cout << "Not initializing threads, only one detector" << endl; + break; + default: + cout << "Initialized Threadpool" << endl; + break; + } + return OK; +} + +void multiSlsDetector::destroyThreadPool(){ + if(threadpool){ + threadpool->destroy_threadpool(); + threadpool=0; + cout<<"Destroyed Threadpool"<numberOfDetectors; @@ -1088,7 +1127,7 @@ int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings ise slsDetectorDefs::detectorSettings multiSlsDetector::getSettings(int pos) { int i, posmin, posmax; - detectorSettings ret1=GET_SETTINGS, ret; + int ret1=-100, ret=-1; if (pos<0) { posmin=0; @@ -1098,21 +1137,49 @@ slsDetectorDefs::detectorSettings multiSlsDetector::getSettings(int pos) { posmax=pos+1; } - for (i=posmin; igetSettings(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<(&slsDetector::getSettings, + detectors[idet],-1,iret[idet])); + threadpool->add_task(task); + } + } + threadpool->wait_for_tasks_to_complete(); + for(int idet=posmin; idetgetSettings(); + if(detectors[i]->getErrorMask()) + setErrorMask(getErrorMask()|(1<currentSettings=ret1; - return ret1; + thisMultiDetector->currentSettings=(detectorSettings)ret; + return (detectorSettings)ret; } slsDetectorDefs::detectorSettings multiSlsDetector::setSettings(detectorSettings isettings, int pos) { diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 311810396..6bfb6adb3 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -16,6 +16,7 @@ ID: $Id$ #include "slsDetectorUtils.h" class slsDetector; +class ThreadPool; //#include "sls_detector_defs.h" @@ -240,6 +241,14 @@ class multiSlsDetector : public slsDetectorUtils { /** destructor */ virtual ~multiSlsDetector(); + /** + * Creates all the threads in the threadpool + \returns OK or FAIL + */ + int createThreadPool(); + + /** destroys all the threads in the threadpool */ + void destroyThreadPool(); /** frees the shared memory occpied by the sharedMultiSlsDetector structure */ int freeSharedMemory() ; @@ -1362,6 +1371,8 @@ class multiSlsDetector : public slsDetectorUtils { /** Shared memory structure */ sharedMultiSlsDetector *thisMultiDetector; + private: + ThreadPool* threadpool; diff --git a/slsDetectorSoftware/threadFiles/CondVar.cpp b/slsDetectorSoftware/threadFiles/CondVar.cpp new file mode 100644 index 000000000..2feff962f --- /dev/null +++ b/slsDetectorSoftware/threadFiles/CondVar.cpp @@ -0,0 +1,17 @@ +#include "CondVar.h" + +CondVar::CondVar() { + pthread_cond_init(&m_cond_var, NULL); +} +CondVar::~CondVar() { + pthread_cond_destroy(&m_cond_var); +} +void CondVar::wait(pthread_mutex_t* mutex) { + pthread_cond_wait(&m_cond_var, mutex); +} +void CondVar::signal() { + pthread_cond_signal(&m_cond_var); +} +void CondVar::broadcast() { + pthread_cond_broadcast(&m_cond_var); +} diff --git a/slsDetectorSoftware/threadFiles/CondVar.h b/slsDetectorSoftware/threadFiles/CondVar.h new file mode 100644 index 000000000..b823ef31d --- /dev/null +++ b/slsDetectorSoftware/threadFiles/CondVar.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include "Global.h" + +using namespace std; + +class CondVar { +public: + + CondVar(); + ~CondVar(); + void wait(pthread_mutex_t* mutex); + void signal(); + void broadcast(); + +private: + pthread_cond_t m_cond_var; +}; diff --git a/slsDetectorSoftware/threadFiles/Global.h b/slsDetectorSoftware/threadFiles/Global.h new file mode 100644 index 000000000..2596df0c0 --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Global.h @@ -0,0 +1,6 @@ +#pragma once + +const int DEFAULT_POOL_SIZE = 10; +const int MAX_SINGLES = 5; +const int STARTED = 0; +const int STOPPED = 1; diff --git a/slsDetectorSoftware/threadFiles/Makefile b/slsDetectorSoftware/threadFiles/Makefile new file mode 100644 index 000000000..19b5b40e4 --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Makefile @@ -0,0 +1,21 @@ +OBJPATH=bin/obj +EXAMPLEPATH=bin/example + +all: + g++ CondVar.cpp -lpthread -c -g -o $(OBJPATH)/CondVar.o + g++ Mutex.cpp -lpthread -c -g -o $(OBJPATH)/Mutex.o + #g++ Task.cpp -lpthread -c -g -o $(OBJPATH)/Task.o + g++ ThreadPool.cpp -lpthread -c -g -o $(OBJPATH)/ThreadPool.o + g++ Multi.cpp -lpthread -c -g -o $(OBJPATH)/Multi.o + #g++ $(OBJPATH)/CondVar.o $(OBJPATH)/Mutex.o $(OBJPATH)/Task.o $(OBJPATH)/ThreadPool.o threadpool_test.cpp Single.cpp Multi.cpp -lpthread -I . -g -o $(EXAMPLEPATH)threadpool_test + g++ $(OBJPATH)/CondVar.o $(OBJPATH)/Mutex.o $(OBJPATH)/ThreadPool.o threadpool_test.cpp Single.cpp Multi.cpp -lpthread -I . -g -o $(EXAMPLEPATH)threadpool_test + +#all: +# g++ threadpool.cpp -lpthread -fpic -c -o bin/obj/threadpool.o +# g++ -L./bin bin/obj/threadpool.o -lpthread threadpool_test.cpp -o bin/example/threadpool_test + +#threadpool: +# g++ threadpool.cpp -lpthread -fpic -c -o bin/obj/threadpool.o +# g++ -shared -fPIC bin/obj/threadpool.o -o bin/lib/libthreadpool.so +#example: +# g++ -L./bin/lib -lthreadpool threadpool_test.cpp -o threadpool_test diff --git a/slsDetectorSoftware/threadFiles/Multi.cpp b/slsDetectorSoftware/threadFiles/Multi.cpp new file mode 100644 index 000000000..7740de5fe --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Multi.cpp @@ -0,0 +1,197 @@ +#include "Multi.h" +#include "Single.h" +#include "ThreadPool.h" + + + +#include +#include +#include +#include +using namespace std; + +char ans[1000]; +int threadflag = 1; + +Multi::Multi() { + numSingles = 1; + threadpool = 0; + for(int i=0;idestroy_threadpool(); + threadpool=0; + } + if(numSingles > 0) + threadpool = new ThreadPool(numSingles); + switch(threadpool->initialize_threadpool()){ + case -1: + cerr << "Failed to initialize thread pool!" << endl; + return 0; + case 0: + cout << "Not initializing threads, only one detector" << endl; + break; + default: + cout << "Initialized Threadpool" << endl; + break; + } + return 1; +} + +int Multi::destroyThreadPool(){ + if(threadpool){ + threadpool->destroy_threadpool(); + threadpool=0; + cout<<"Destroyed Threadpool"<* binder = + // new func_t(&Single::printNumber,singles[i],inum,iret[i]); + Task* task = new Task(new func_t(&Single::printNumber,singles[i],inum,iret[i])); + threadpool->add_task(task); + } + threadpool->wait_for_tasks_to_complete(); + + + for(int i=0;i1){ + string* sret[numSingles]; + + + for(int i=0;i* binder = + new func_t(&Single::printString,singles[i],s,sret[i]); + Task* task = new Task(binder); + threadpool->add_task(task); + } + threadpool->wait_for_tasks_to_complete(); + for(int i=0;iprintString(s); + if(ret=="error") + ret = ret1; + else if (ret != ret1) + ret = "sss"; + } + } + return ret; +} + +char* Multi::printCharArray(char a[]){ + string ret="error", ret1="sss"; + + if(numSingles>1){ + string* sret[numSingles]; + + for(int i=0;i* binder = + new func_t (&Single::printCharArray,singles[i],a,sret[i]); + Task* task = new Task(binder); + threadpool->add_task(task); + } + threadpool->wait_for_tasks_to_complete(); + + for(int i=0;iprintCharArray(a); + if(ret=="error") + ret = ret1; + else if (ret != ret1) + ret = "sss"; + } + } + strcpy(ans,ret.c_str()); + return ans; +} diff --git a/slsDetectorSoftware/threadFiles/Multi.h b/slsDetectorSoftware/threadFiles/Multi.h new file mode 100644 index 000000000..b7216c579 --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Multi.h @@ -0,0 +1,36 @@ +#pragma once + + +#include "Global.h" + +#include +using namespace std; + +class Single; +class ThreadPool; + +class Multi { +public: + + Multi(); + ~Multi(); + + string executeCommand(int argc,char* argv[]); + + int printNumber(int inum); + string printString(string s); + char* printCharArray(char a[]); + + int createThreadPool(); + int destroyThreadPool(); + +protected: + Single* singles[MAX_SINGLES]; + int numSingles; + ThreadPool* threadpool; + + + +}; + + diff --git a/slsDetectorSoftware/threadFiles/Mutex.cpp b/slsDetectorSoftware/threadFiles/Mutex.cpp new file mode 100644 index 000000000..3f7cdca25 --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Mutex.cpp @@ -0,0 +1,26 @@ +#include "Mutex.h" + +Mutex::Mutex() { + pthread_mutex_init(&m_lock, NULL); + is_locked = false; +} + +Mutex::~Mutex() { + while(is_locked); + unlock(); // Unlock Mutex after shared resource is safe + pthread_mutex_destroy(&m_lock); +} + +void Mutex::lock() { + pthread_mutex_lock(&m_lock); + is_locked = true; +} + +void Mutex::unlock() { + is_locked = false; // do it BEFORE unlocking to avoid race condition + pthread_mutex_unlock(&m_lock); +} + +pthread_mutex_t* Mutex::get_mutex_ptr(){ + return &m_lock; +} diff --git a/slsDetectorSoftware/threadFiles/Mutex.h b/slsDetectorSoftware/threadFiles/Mutex.h new file mode 100644 index 000000000..a88df0d4e --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Mutex.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "Global.h" + +using namespace std; + +class Mutex +{ +public: + Mutex(); + ~Mutex(); + void lock(); + void unlock(); + pthread_mutex_t* get_mutex_ptr(); + +private: + pthread_mutex_t m_lock; + volatile bool is_locked; +}; diff --git a/slsDetectorSoftware/threadFiles/Single.cpp b/slsDetectorSoftware/threadFiles/Single.cpp new file mode 100644 index 000000000..43b0ca14b --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Single.cpp @@ -0,0 +1,37 @@ +#include "Single.h" + +#include +#include +using namespace std; + +char local_ans[1000]; + +Single::Single(int id) { + detID = id; + // cout<<"detID:"< +using namespace std; + +class Single { +public: + Single(int id); + ~Single(); + int getID(); + + int printNumber(int i); + string printString(string s); + char* printCharArray(char a[]); + +private: + int detID; + + int* someValue; + +}; + diff --git a/slsDetectorSoftware/threadFiles/Task.h b/slsDetectorSoftware/threadFiles/Task.h new file mode 100644 index 000000000..3f096382e --- /dev/null +++ b/slsDetectorSoftware/threadFiles/Task.h @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "Global.h" +#include "sls_detector_defs.h" + +#include +using namespace std; + +class slsDetector; + + +template +class func_t{ +public: + func_t(_Ret (_Class::*fn)(_Arg1),_Class* ptr,_Arg1 arg1, _Store* sto):m_fn(fn),m_ptr(ptr),m_arg1(arg1),m_store(sto){} + ~func_t() {} + + void operator()() const {*m_store = ((m_ptr->*m_fn)(m_arg1));} + +private: + _Class* m_ptr; + _Ret (_Class::*m_fn)(_Arg1); + _Arg1 m_arg1; + _Store* m_store; +}; + + +class Task: public virtual slsDetectorDefs{ +public: + Task(func_t * t):m_int1(t),m_string1(0),m_chararr1(0), + m_settings(0){}; + Task(func_t * t): m_int1(0),m_string1(t),m_chararr1(0), + m_settings(0){}; + Task(func_t * t):m_int1(0),m_string1(0),m_chararr1(t), + m_settings(0){}; + + + //settings + Task(func_t * t): + m_int1(0),m_string1(0),m_chararr1(0), + m_settings(t) + {}; + + ~Task(){} + + void operator()(){ + if(m_int1) (*m_int1)(); + else if(m_string1) (*m_string1)(); + else if(m_chararr1) (*m_chararr1)(); + else if(m_settings) (*m_settings)(); + } + +private: + func_t * m_int1; + func_t * m_string1; + func_t * m_chararr1; + func_t * m_settings; +}; + + diff --git a/slsDetectorSoftware/threadFiles/ThreadPool.cpp b/slsDetectorSoftware/threadFiles/ThreadPool.cpp new file mode 100644 index 000000000..bb5a06419 --- /dev/null +++ b/slsDetectorSoftware/threadFiles/ThreadPool.cpp @@ -0,0 +1,175 @@ +#include "ThreadPool.h" + + +ThreadPool::ThreadPool(int pool_size) : m_pool_size(pool_size) +{ + cout << "Constructed ThreadPool of size " << m_pool_size << endl; + m_tasks_loaded = false; + thread_started = false; + current_thread_number = -1; + number_of_ongoing_tasks = 0; +} + +ThreadPool::~ThreadPool() +{ + // Release resources + if (m_pool_state != STOPPED) { + destroy_threadpool(); + } +} + +// We can't pass a member function to pthread_create. +// So created the wrapper function that calls the member function +// we want to run in the thread. +extern "C" +void* start_thread(void* arg) +{ + ThreadPool* tp = (ThreadPool*) arg; + tp->execute_thread(); + return NULL; +} + +int ThreadPool::initialize_threadpool() +{ + if(m_pool_size == 1) + return m_pool_size; + + // TODO: COnsider lazy loading threads instead of creating all at once + m_pool_state = STARTED; + int ret = -1; + for (int i = 0; i < m_pool_size; i++) { + pthread_t tid; + thread_started = false; + current_thread_number = i; + ret = pthread_create(&tid, NULL, start_thread, (void*) this); + if (ret != 0) { + cerr << "pthread_create() failed: " << ret << endl; + return 0; + } + m_threads.push_back(tid); + while(!thread_started); + } + cout << m_pool_size << " threads created by the thread pool" << endl; + + return m_pool_size; +} + +int ThreadPool::destroy_threadpool() +{ if(m_pool_size == 1) + return 0; + //cout << "in destroying threadpool" << endl; + // Note: this is not for synchronization, its for thread communication! + // destroy_threadpool() will only be called from the main thread, yet + // the modified m_pool_state may not show up to other threads until its + // modified in a lock! + m_task_mutex.lock(); + m_pool_state = STOPPED; + m_task_mutex.unlock(); + /*cout << "Broadcasting STOP signal to all threads..." << endl;*/ + m_task_cond_var.broadcast(); // notify all threads we are shttung down + + int ret = -1; + for (int i = 0; i < m_pool_size; i++) { + void* result; + ret = pthread_join(m_threads[i], &result); + /*cout << "pthread_join() returned " << ret << ": " << strerror(errno) << endl;*/ + m_task_cond_var.broadcast(); // try waking up a bunch of threads that are still waiting + } + number_of_ongoing_tasks = 0; + /* cout << m_pool_size << " threads exited from the thread pool" << endl;*/ + return 0; +} + +void* ThreadPool::execute_thread() +{ + int ithread = current_thread_number; + thread_started = true; + Task* task = NULL; + m_tasks_loaded = false; + /*cout << "Starting thread " << pthread_self() << endl;*/ + while(true) { + // Try to pick a task + /*cout << "Locking: " << pthread_self() << endl;*/ + m_task_mutex.lock(); + + // We need to put pthread_cond_wait in a loop for two reasons: + // 1. There can be spurious wakeups (due to signal/ENITR) + // 2. When mutex is released for waiting, another thread can be waken up + // from a signal/broadcast and that thread can mess up the condition. + // So when the current thread wakes up the condition may no longer be + // actually true! + while ((m_pool_state != STOPPED) && (m_tasks.empty())) { + // Wait until there is a task in the queue + // Unlock mutex while wait, then lock it back when signaled + /* cout << "Unlocking and waiting: " << pthread_self() << endl;*/ + m_task_cond_var.wait(m_task_mutex.get_mutex_ptr()); + /* cout << "Signaled and locking: " << pthread_self() << endl;*/ + } + + // If the thread was woken up to notify process shutdown, return from here + if (m_pool_state == STOPPED) { + /* cout << "Unlocking and exiting: " << pthread_self() << endl;*/ + m_task_mutex.unlock(); + pthread_exit(NULL); + } + + task = m_tasks.front(); + m_tasks.pop_front(); + /*cout << "Unlocking: " << pthread_self() << endl;*/ + m_task_mutex.unlock(); + + //cout << "Executing thread " << pthread_self() << endl; + // execute the task + (*task)(); // could also do task->run(arg); + //cout << "Done executing thread " << pthread_self() << endl; + + m_all_tasks_mutex.lock(); + number_of_ongoing_tasks--; // cout<<"number_of_ongoing_tasks:"< +#include +#include +#include +#include +#include +#include +#include + +#include "Mutex.h" +#include "Task.h" +#include "CondVar.h" +#include "Global.h" + +using namespace std; + + +class ThreadPool +{ +public: + ThreadPool(int pool_size); + ~ThreadPool(); + int initialize_threadpool(); + int destroy_threadpool(); + void* execute_thread(); + int add_task(Task* task); + void wait_for_tasks_to_complete(); + +private: + int m_pool_size; + Mutex m_task_mutex; + CondVar m_task_cond_var; + std::vector m_threads; // storage for threads + std::deque m_tasks; + volatile int m_pool_state; + + Mutex m_all_tasks_mutex; + CondVar m_all_tasks_cond_var; + bool m_tasks_loaded; + bool thread_started; + int current_thread_number; + + //volatile uint64_t tasks_done_mask; + volatile int number_of_ongoing_tasks; +}; + diff --git a/slsDetectorSoftware/threadFiles/bin/examplethreadpool_test b/slsDetectorSoftware/threadFiles/bin/examplethreadpool_test new file mode 100755 index 0000000000000000000000000000000000000000..621d57a47f74528975963d0647a59063f7c72fb9 GIT binary patch literal 237980 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 ZTvKXJ3}AIOo&e#a^CGTV)y~}Ze*vkKrtkm& literal 0 HcmV?d00001 diff --git a/slsDetectorSoftware/threadFiles/threadpool_test.cpp b/slsDetectorSoftware/threadFiles/threadpool_test.cpp new file mode 100644 index 000000000..2dbd2c416 --- /dev/null +++ b/slsDetectorSoftware/threadFiles/threadpool_test.cpp @@ -0,0 +1,61 @@ +//#include "ThreadPool.h" + +//#include "threadpool.h" + +#include +#include + +#include "Multi.h" +using namespace std; + +//const int MAX_TASKS = 4; + +/* +void hello(void* arg) +{ + string* x = (string*) arg; + cout << "Hello: " << *x << endl; +// cout << "\n"; +} +*/ +int main(int argc, char* argv[]) +{ + + Multi* m = new Multi(); + cout<<"Answer:"<< m->executeCommand(argc,argv) << endl; + delete m; + /* + ThreadPool tp(2); + int ret = tp.initialize_threadpool(); + if (ret == -1) { + cerr << "Failed to initialize thread pool!" << endl; + return 0; + } +*/ + + +/* + for (int i = 0; i < MAX_TASKS; i++) { + cout<<"adding task:" <