diff options
author | David Robillard <d@drobilla.net> | 2013-02-04 00:54:25 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2013-02-04 00:54:25 +0000 |
commit | 5034a4b8cfcbc57423028031419f0f38a2ffc405 (patch) | |
tree | 78a035592d478961c70f797a73b6b09fe5fe486b | |
parent | 125de9306bc724d70dd377c5cadf1af98a5db933 (diff) | |
download | raul-5034a4b8cfcbc57423028031419f0f38a2ffc405.tar.gz raul-5034a4b8cfcbc57423028031419f0f38a2ffc405.tar.bz2 raul-5034a4b8cfcbc57423028031419f0f38a2ffc405.zip |
Replace Raul::thread with std::thread.
git-svn-id: http://svn.drobilla.net/lad/trunk/raul@5047 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r-- | raul/Thread.hpp | 120 | ||||
-rw-r--r-- | test/queue_test.cpp | 45 | ||||
-rw-r--r-- | test/sem_test.cpp | 37 | ||||
-rw-r--r-- | test/thread_test.cpp | 44 |
4 files changed, 52 insertions, 194 deletions
diff --git a/raul/Thread.hpp b/raul/Thread.hpp deleted file mode 100644 index 11cd0fb..0000000 --- a/raul/Thread.hpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - This file is part of Raul. - Copyright 2007-2012 David Robillard <http://drobilla.net> - - Raul is free software: you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation, either version 3 of the License, or any later version. - - Raul is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Raul. If not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef RAUL_THREAD_HPP -#define RAUL_THREAD_HPP - -#include "raul/Noncopyable.hpp" - -namespace Raul { - -/** Abstract base class for a thread. - * - * Extend this and override the _run method to easily create a thread - * to perform some task. - * - * \ingroup raul - */ -class Thread : Noncopyable -{ -public: - virtual ~Thread() { - join(); - } - - /** Start the thread if it is not already running. - * - * This is separate from construction to prevent race conditions during - * construction of derived classes. - */ - virtual void start() { - if (!_thread_exists) { - pthread_attr_t attr; - pthread_attr_init(&attr); - pthread_attr_setstacksize(&attr, 1500000); - - pthread_create(&_pthread, &attr, _static_run, this); - _thread_exists = true; - } - } - - /** Stop the thread and block the caller until the thread exits. - * - * This sets _exit_flag to true, derived classes must ensure they actually - * exit when this occurs. - */ - virtual void join() { - if (_thread_exists) { - _exit_flag = true; - pthread_join(_pthread, NULL); - _thread_exists = false; - } - } - - /** Set the scheduling policy for this thread. - * @return True on success. - */ - virtual bool set_scheduling(bool realtime, unsigned priority) { - if (_thread_exists) { - sched_param sp; - sp.sched_priority = priority; - const int policy = realtime ? SCHED_FIFO : SCHED_OTHER; - return !pthread_setschedparam(_pthread, policy, &sp); - } else { - return false; - } - } - -protected: - /** Construct a thread. - * - * Note this does not actually start a thread to prevent race conditions - * during construction. To actually begin execution, call start(). - */ - explicit Thread() - : _thread_exists(false) - , _exit_flag(false) - {} - - - /** Thread function to execute. - * - * This is called once on start, and terminated on stop. - * Implementations likely want to put some infinite loop here. - * - * When _exit_flag becomes true (via a call to stop()) the loop - * should exit. - */ - virtual void _run() {} - -private: - static void* _static_run(void* thread) { - Thread* me = static_cast<Thread*>(thread); - me->_run(); - me->_thread_exists = false; - return NULL; - } - - pthread_t _pthread; - bool _thread_exists; - -protected: - bool _exit_flag; -}; - -} // namespace Raul - -#endif // RAUL_THREAD_HPP diff --git a/test/queue_test.cpp b/test/queue_test.cpp index b13c13f..15e5975 100644 --- a/test/queue_test.cpp +++ b/test/queue_test.cpp @@ -22,11 +22,11 @@ #include <atomic> #include <iostream> #include <string> +#include <thread> #include <vector> #include "raul/SRMWQueue.hpp" #include "raul/SRSWQueue.hpp" -#include "raul/Thread.hpp" #include "raul/fmt.hpp" using namespace std; @@ -61,26 +61,22 @@ struct WriteAction { // The victim SRMWQueue<WriteAction> queue(QUEUE_SIZE); -class WriteThread : public Thread { -public: - WriteThread() {} - -protected: - void _run() { - while (!_exit_flag) { - for (unsigned j=0; j < PUSHES_PER_ITERATION; ++j) { - unsigned i = rand() % NUM_DATA; - if (queue.push(WriteAction(i))) { - ++(data[i].write_count); - //cout << "WRITE " << i << "\r\n"; - } else { - //cerr << "FAILED WRITE\r\n"; - } +static void +test_write(bool* exit_flag) +{ + while (!*exit_flag) { + for (unsigned j=0; j < PUSHES_PER_ITERATION; ++j) { + unsigned i = rand() % NUM_DATA; + if (queue.push(WriteAction(i))) { + ++(data[i].write_count); + //cout << "WRITE " << i << "\r\n"; + } else { + //cerr << "FAILED WRITE\r\n"; } } - - cout << "Writer exiting." << endl; } + + cout << "Writer exiting." << endl; }; // Returns 0 if all read count/write count pairs are equal, @@ -129,11 +125,12 @@ main() } cout << "Testing concurrent reading/writing" << endl; - vector<WriteThread*> writers(NUM_WRITERS, NULL); + bool exit_flags[NUM_WRITERS]; + vector<std::thread*> writers(NUM_WRITERS, NULL); - for (unsigned i=0; i < NUM_WRITERS; ++i) { - writers[i] = new WriteThread(); - writers[i]->start(); + for (unsigned i = 0; i < NUM_WRITERS; ++i) { + exit_flags[i] = false; + writers[i] = new std::thread(test_write, &exit_flags[i]); } // Read @@ -158,8 +155,10 @@ main() cout << "Processed " << total_processed << " requests" << endl; // Stop the writers - for (unsigned i=0; i < NUM_WRITERS; ++i) + for (unsigned i = 0; i < NUM_WRITERS; ++i) { + exit_flags[i] = true; writers[i]->join(); + } //cout << "\n\n****************** DONE *********************\n\n"; diff --git a/test/sem_test.cpp b/test/sem_test.cpp index 1836317..4211ce3 100644 --- a/test/sem_test.cpp +++ b/test/sem_test.cpp @@ -14,36 +14,30 @@ along with Raul. If not, see <http://www.gnu.org/licenses/>. */ -#include <iostream> #include <limits.h> #include <unistd.h> -#include "raul/Thread.hpp" +#include <iostream> +#include <thread> + #include "raul/Semaphore.hpp" using namespace std; using namespace Raul; -class Waiter : public Raul::Thread { -public: - Waiter(Semaphore& sem) : Raul::Thread(), _sem(sem) - {} - -private: - void _run() { - while (true) { - if (_sem.timed_wait(250)) { - cout << "[Waiter] Received signal" << endl; - break; - } else { - cout << "[Waiter] Timed out" << endl; - } +static void +wait(Semaphore* sem) +{ + while (true) { + if (sem->timed_wait(250)) { + cout << "[Waiter] Received signal" << endl; + break; + } else { + cout << "[Waiter] Timed out" << endl; } - cout << "[Waiter] Exiting" << endl; } - - Semaphore& _sem; -}; + cout << "[Waiter] Exiting" << endl; +} int main() @@ -60,8 +54,7 @@ main() return 1; } - Waiter waiter(sem); - waiter.start(); + std::thread waiter(wait, &sem); sleep(1); diff --git a/test/thread_test.cpp b/test/thread_test.cpp index 785e596..7fcaf9f 100644 --- a/test/thread_test.cpp +++ b/test/thread_test.cpp @@ -16,9 +16,9 @@ #include <atomic> #include <iostream> +#include <thread> #include "raul/Semaphore.hpp" -#include "raul/Thread.hpp" #include "raul/ThreadVar.hpp" using namespace std; @@ -27,39 +27,25 @@ using namespace Raul; Raul::ThreadVar<int> var(0); std::atomic<int> n_errors(0); -class Waiter : public Raul::Thread { -public: - Waiter(Semaphore& sem) : Raul::Thread(), _sem(sem) { - if (set_scheduling(true, 10)) { - cerr << "Set priority on non-existent thread" << endl; - } - } - -private: - void _run() { - if (!set_scheduling(true, 10)) { - cerr << "Failed to set priority" << endl; - } - var = 41; - cout << "[Waiter] Waiting for signal..." << endl; - _sem.wait(); - cout << "[Waiter] Received signal, exiting" << endl; - var = 42; - if (var != 42) { - cerr << "[Waiter] var != 42" << endl; - ++n_errors; - } +static void +wait(Semaphore* sem) +{ + var = 41; + cout << "[Waiter] Waiting for signal..." << endl; + sem->wait(); + cout << "[Waiter] Received signal, exiting" << endl; + var = 42; + if (var != 42) { + cerr << "[Waiter] var != 42" << endl; + ++n_errors; } - - Semaphore& _sem; -}; +} int main() { - Semaphore sem(0); - Waiter waiter(sem); - waiter.start(); + Semaphore sem(0); + std::thread waiter(wait, &sem); var = 24; |