// © 2016 and later: Unicode, Inc. and others. // License & terms of use: http://www.unicode.org/copyright.html /******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2015, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ #ifndef SIMPLETHREAD_H #define SIMPLETHREAD_H #include #include "unicode/utypes.h" /* * Simple class for creating threads in ICU tests. * Originally created to provide a portable abstraction over platform * (POSIX or Win32) threading interfaces. * * New threaded tests should consider skipping this class and directly using C++ std library * threading functions. SimpleThread is retained primarily to support existing use. */ class SimpleThread { public: SimpleThread(); virtual ~SimpleThread(); int32_t start(); // start the thread. Return 0 if successfull. void join(); // A thread must be joined before deleting its SimpleThread. virtual void run() = 0; // Override this to provide the code to run // in the thread. private: std::thread fThread = {}; }; class IntlTest; // ThreadPool - utililty class to simplify the spawning a group of threads by // a multi-threaded test. // // Usage: from within an intltest test function, // ThreadPool pool( // this, // The current intltest test object, // // of type "TestClass *" // numberOfThreads, // How many threads to spawn. // &TestClass::func); // The function to be run by each thread. // // It takes one int32_t parameter which // // is set to the thread number, 0 to numberOfThreads-1. // // pool.start(); // Start all threads running. // pool.join(); // Wait until all threads have terminated. class ThreadPoolBase { public: ThreadPoolBase(IntlTest *test, int32_t numThreads); virtual ~ThreadPoolBase(); void start(); void join(); protected: virtual void callFn(int32_t param) = 0; friend class ThreadPoolThread; IntlTest *fIntlTest; int32_t fNumThreads; SimpleThread **fThreads; }; template class ThreadPool : public ThreadPoolBase { private: void (TestClass::*fRunFnPtr)(int32_t); public: ThreadPool(TestClass *test, int howMany, void (TestClass::*runFnPtr)(int32_t threadNumber)) : ThreadPoolBase(test, howMany), fRunFnPtr(runFnPtr) {} virtual ~ThreadPool() {} private: virtual void callFn(int32_t param) { TestClass *test = dynamic_cast(fIntlTest); (test->*fRunFnPtr)(param); } }; #endif