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  | 
