diff options
Diffstat (limited to 'build/03Thread/main.cpp')
-rw-r--r-- | build/03Thread/main.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/build/03Thread/main.cpp b/build/03Thread/main.cpp new file mode 100644 index 0000000..ed12172 --- /dev/null +++ b/build/03Thread/main.cpp @@ -0,0 +1,154 @@ +//#include <SDL2/SDL.h> +//#include <SDL2/SDL_thread.h> +//#include <iostream> +//#include <sstream> +//#include <stdexcept> +// +//class SdlMutex +//{ +//public: +// SdlMutex() +// { +// mutex = SDL_CreateMutex(); +// if (!mutex) throw std::runtime_error("SDL_CreateMutex == NULL"); +// } +// +// ~SdlMutex() +// { +// SDL_DestroyMutex(mutex); +// } +// +// void lock() +// { +// if (SDL_mutexP(mutex) == -1) throw std::runtime_error("SDL_mutexP == -1"); +// // Note: +// // -1 does not mean it was already locked - it means there was an error in locking - +// // if it was locked it will just block - see SDL_mutexP(3) +// } +// +// void unlock() +// { +// if (SDL_mutexV(mutex) == -1) throw std::runtime_error("SDL_mutexV == -1"); +// } +// +// SDL_mutex* underlying() +// { +// return mutex; +// } +//private: +// SDL_mutex* mutex; +//}; +// +//class SdlScopedLock +//{ +//public: +// SdlScopedLock(SdlMutex& mutex) +// : +// mutex(mutex) +// { +// mutex.lock(); +// } +// ~SdlScopedLock() +// { +// try +// { +// this->unlock(); +// } +// catch (const std::exception& e) +// { +// // Destructors should never throw ... +// std::cerr << "SdlScopedLock::~SdlScopedLock - caught : " << e.what() << std::endl; +// } +// } +// void unlock() +// { +// mutex.unlock(); +// } +//private: +// SdlMutex& mutex; +//}; +// +//class ThreadData +//{ +//public: +// ThreadData() +// : +// dataReady(false), +// done(false) +// { +// condition = SDL_CreateCond(); +// } +// +// ~ThreadData() +// { +// SDL_DestroyCond(condition); +// } +// +// // Using stringstream so I can just shift on integers... +// std::stringstream data; +// bool dataReady; +// bool done; +// SdlMutex mutex; +// SDL_cond* condition; +//}; +// +//int threadFunction(void* data) +//{ +// try +// { +// ThreadData* threadData = static_cast< ThreadData* >(data); +// +// for (size_t i = 0; i < 100; i++) +// { +// { +// SdlScopedLock lock(threadData->mutex); +// // Everything in this scope is now syncronized with the mutex +// if (i != 0) threadData->data << ", "; +// threadData->data << i; +// threadData->dataReady = true; +// } // threadData->mutex is automatically unlocked here +// // Its important to note that condition should be signaled after mutex is unlocked +// if (SDL_CondSignal(threadData->condition) == -1) throw std::runtime_error("Failed to signal"); +// } +// { +// SdlScopedLock lock(threadData->mutex); +// threadData->done = true; +// } +// if (SDL_CondSignal(threadData->condition) == -1) throw std::runtime_error("Failed to signal"); +// return 0; +// } +// catch (const std::exception& e) +// { +// std::cerr << "Caught : " << e.what() << std::endl; +// return 1; +// } +//} +// +//int main(int argc, char* argv[]) +//{ +// ThreadData threadData; +// SDL_Thread* thread = SDL_CreateThread(threadFunction, "", &threadData); +// +// while (true) +// { +// SdlScopedLock lock(threadData.mutex); +// while (threadData.dataReady == false && threadData.done == false) +// { +// // NOTE: must call condition wait with mutex already locked +// if (SDL_CondWait(threadData.condition, threadData.mutex.underlying()) == -1) throw std::runtime_error("Failed to wait"); +// } +// // once dataReady == true or threadData.done == true we get here +// std::cout << "Got data = " << threadData.data.str() << std::endl; +// threadData.data.str(""); +// threadData.dataReady = false; +// if (threadData.done) +// { +// std::cout << "child done - ending" << std::endl; +// break; +// } +// } +// +// int status = 99; +// SDL_WaitThread(thread, &status); +// std::cerr << "Thread completed with : " << status << std::endl; +//}
\ No newline at end of file |