summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-02-04 00:54:25 +0000
committerDavid Robillard <d@drobilla.net>2013-02-04 00:54:25 +0000
commit5034a4b8cfcbc57423028031419f0f38a2ffc405 (patch)
tree78a035592d478961c70f797a73b6b09fe5fe486b
parent125de9306bc724d70dd377c5cadf1af98a5db933 (diff)
downloadraul-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.hpp120
-rw-r--r--test/queue_test.cpp45
-rw-r--r--test/sem_test.cpp37
-rw-r--r--test/thread_test.cpp44
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;